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

时间:2010-07-16 16:30:53

标签: powershell

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

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

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

$AssemblyName = $Assembly.GetName()
$Assemblyversion = $AssemblyName.version

这也是:

$file = Get-ChildItem -recurse | %{ $_.VersionInfo }

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

6 个答案:

答案 0 :(得分:57)

这是一个很漂亮的班轮:

Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo

简称PowerShell版本2:

ls -fi *.dll -r | % { $_.versioninfo }

简称PowerShell版本3,由tamasf建议:

ls *.dll -r | % versioninfo

答案 1 :(得分:32)

作为一个丑陋的单行:

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

如果您只想要当前目录,那么显然要省略-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

答案 2 :(得分:2)

这是一个漂亮的单行:

Get-ChildItem -Filter *.dll -Recurse | ForEach-Object `
{
    return [PSCustomObject]@{
        Name = $_.Name
        FileVersion = $_.VersionInfo.FileVersion
        AssemblyVersion = ([Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version)
    }
}

示例输出:

Name            FileVersion AssemblyVersion
----            ----------- ---------------
Minimatch.dll   1.1.0.0     1.1.0.0
VstsTaskSdk.dll 1.0.0.0     1.0.0.0

答案 3 :(得分:1)

让Select-Object创建属性

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

与示例输出相似

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

答案 4 :(得分:0)

基于乔伊的答案,但利用一些方便的行为进行隐式异常处理。首先添加一个扩展属性:

Update-TypeData -TypeName System.IO.FileInfo -MemberType ScriptProperty -MemberName AssemblyVersion -Value { [Reflection.AssemblyName]::GetAssemblyName($this.FullName).Version }

可以选择将其放置在您的个人资料中以供重复使用。那么实际的选择只是例如

Get-ChildItem -Filter *.dll -Recurse | Select-Object Name,AssemblyVersion

作为旁注,我将其发布为其他答案的主要原因是为了让像我这样的PowerShell新手受益:我花了很长时间才发现其中的$_在给$this 的定义中,乔伊的答案需要变成Update-TypeData

答案 5 :(得分:-1)

$j = 'C:\Program Files\MySQL\Connector ODBC 8.0\' # this is the path of foler where you want check your dlls 
$files = get-childitem $j -recurse -include *.dll # this is the command thatwill check all the dlls in that folder 

foreach ($i in $files) {
   $verison = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($i).FileVersion
   Write-Host  "$i ----> $verison "
} # loop is used where it will travel throuhg all the files of the specified folder and check the verion and will print it