我希望能够在目录及其所有子目录中获取所有DLL文件的文件版本和汇编版本。我是编程新手,我无法弄清楚如何使这个循环工作。
我有这个PowerShell代码来获取程序集版本(取自论坛):
$strPath = 'c:\ADMLibrary.dll'
$Assembly = [Reflection.Assembly]::Loadfile($strPath)
$AssemblyName = $Assembly.GetName()
$Assemblyversion = $AssemblyName.version
这也是:
$file = Get-ChildItem -recurse | %{ $_.VersionInfo }
如何制作循环,以便我可以返回目录中所有文件的汇编版本?
答案 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