获取当前目录和所有子目录中DLL文件的文件版本和汇编版本

Tim*_*yan 39 powershell

我希望能够在目录及其所有子目录中获取所有DLL文件的文件版本和汇编版本.我是编程的新手,我无法弄清楚如何使这个循环工作.

我有这个PowerShell代码来获取程序集版本(取自论坛):

$strPath = 'c:\ADMLibrary.dll'
$Assembly = [Reflection.Assembly]::Loadfile($strPath)

$AssemblyName = $Assembly.GetName()
$Assemblyversion = $AssemblyName.version
Run Code Online (Sandbox Code Playgroud)

这也是:

$file = Get-ChildItem -recurse | %{ $_.VersionInfo }
Run Code Online (Sandbox Code Playgroud)

如何从中循环,以便我可以返回目录中所有文件的汇编版本?

knu*_*nut 63

这是一个很漂亮的班轮:

Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo
Run Code Online (Sandbox Code Playgroud)

简而言之,PowerShell版本2:

ls -fi *.dll -r | % { $_.versioninfo }
Run Code Online (Sandbox Code Playgroud)

简而言之,tamasf建议的PowerShell版本3 :

ls *.dll -r | % versioninfo
Run Code Online (Sandbox Code Playgroud)

  • 简而言之:ls*.dll -r | % 版本信息 (7认同)
  • 这只会产生FileVersion但不会产生AssemblyVersion (7认同)

Joe*_*oey 33

作为一个丑陋的单行:

Get-ChildItem -Filter *.dll -Recurse |
    ForEach-Object {
        try {
            $_ | Add-Member NoteProperty FileVersion ($_.VersionInfo.FileVersion)
            $_ | Add-Member NoteProperty AssemblyVersion (
                [Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version
            )
        } catch {}
        $_
    } |
    Select-Object Name,FileVersion,AssemblyVersion
Run Code Online (Sandbox Code Playgroud)

如果您只想要当前目录,那么显然要省略-Recurse参数.如果您想要所有文件而不仅仅是DLL,那么删除-Filter参数及其参数.代码(希望)非常简单.

我建议你将try块中令人讨厌的部分拆分成单独的函数,因为这样会使错误处理变得不那么尴尬.

样本输出:

Name                                    FileVersion     AssemblyVersion
----                                    -----------     ---------------
Properties.Resources.Designer.cs.dll    0.0.0.0         0.0.0.0
My Project.Resources.Designer.vb.dll    0.0.0.0         0.0.0.0
WindowsFormsControlLibrary1.dll         1.0.0.0         1.0.0.0
WindowsFormsControlLibrary1.dll         1.0.0.0         1.0.0.0
WindowsFormsControlLibrary1.dll         1.0.0.0         1.0.0.0
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`AssemblyName.GetAssemblyName`来获取AssemblyName(因此也可以使用AssemblyVersion)而无需加载程序集 (3认同)
  • 这确实是一个缺点。您可以通过生成一个新的 PowerShell 实例来规避此问题:“powershell -NoProfile -OutputFormat XML -EncodedCommand $encodedCommand |%{$_}”,其中“$encodedCommand”是上述代码段的 Base64 编码变体(请参阅“powershell /? ` 有关如何获取它的示例)。这将生成与其他方式生成的相同对象,但加载文件的 shell 现在不再存在。 (2认同)

小智 5

让 Select-Object 创建属性

Get-ChildItem -Filter *.dll -Recurse | Select-Object Name,@{n='FileVersion';e={$_.VersionInfo.FileVersion}},@{n='AssemblyVersion';e={[Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version}}
Run Code Online (Sandbox Code Playgroud)

和 Sample 输出类似

Name                                           FileVersion AssemblyVersion
----                                           ----------- ---------------
CI.EntityFramework.Initialization.dll          1.0.0.0     1.0.0.0
Castle.Core.dll                                3.3.0.43    3.3.0.0
Castle.Windsor.dll                             3.3.0.51    3.3.0.0
Mutare.VitalLink.dll                           1.0.0.0     1.0.0.0
Newtonsoft.Json.dll                            9.0.1.19813 9.0.0.0
Run Code Online (Sandbox Code Playgroud)