Powershell 获取当前目录和所有子目录中DLL文件的文件版本和程序集版本
我希望能够获得一个目录及其所有子目录中所有DLL文件的文件版本和程序集版本。我是编程新手,我不知道如何使这个循环工作 我使用此PowerShell代码获取程序集版本(取自论坛): 这也是:Powershell 获取当前目录和所有子目录中DLL文件的文件版本和程序集版本,powershell,Powershell,我希望能够获得一个目录及其所有子目录中所有DLL文件的文件版本和程序集版本。我是编程新手,我不知道如何使这个循环工作 我使用此PowerShell代码获取程序集版本(取自论坛): 这也是: $file = Get-ChildItem -recurse | %{ $_.VersionInfo } 如何对此进行循环,以便返回目录中所有文件的程序集版本?作为难看的一行: Get-ChildItem -Filter *.dll -Recurse | ForEach-Object {
$file = Get-ChildItem -recurse | %{ $_.VersionInfo }
如何对此进行循环,以便返回目录中所有文件的程序集版本?作为难看的一行:
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
Get-ChildItem -Filter *.dll -Recurse | ForEach-Object `
{
return [PSCustomObject]@{
Name = $_.Name
FileVersion = $_.VersionInfo.FileVersion
AssemblyVersion = ([Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version)
}
}
如果您只需要当前目录,那么显然可以省略-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
Name FileVersion AssemblyVersion
---- ----------- ---------------
Minimatch.dll 1.1.0.0 1.1.0.0
VstsTaskSdk.dll 1.0.0.0 1.0.0.0
这是一条漂亮的单行线:
Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo
简而言之,PowerShell版本2:
ls -fi *.dll -r | % { $_.versioninfo }
简而言之,PowerShell版本3的建议如下:
这是一条漂亮的单行线:
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
Get-ChildItem -Filter *.dll -Recurse | ForEach-Object `
{
return [PSCustomObject]@{
Name = $_.Name
FileVersion = $_.VersionInfo.FileVersion
AssemblyVersion = ([Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version)
}
}
样本输出:
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
Name FileVersion AssemblyVersion
---- ----------- ---------------
Minimatch.dll 1.1.0.0 1.1.0.0
VstsTaskSdk.dll 1.0.0.0 1.0.0.0
让选择对象创建属性
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
基于Joey的答案,但利用一些方便的行为进行隐式异常处理。首先添加扩展属性:
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 noobs的利益:我花了很长时间才发现Joey答案中的
$\ucode>需要在更新类型数据
的定义中转换为$this
,简而言之:ls*.dll-r |%versionInfo这只会产生FileVersion,而不是AssemblyVersionFor managed dll,要获取真实/更新的版本信息,.NET确实是唯一的方法。看看下面的“更新”,其余的都过于复杂了:p这个可以工作,但不幸的是它加载了文件,却从未发布过它们。。。运行它,然后尝试删除其中一个文件。这确实是一个缺点。您可以通过生成一个新的PowerShell实例来绕过此问题:PowerShell-NoProfile-OutputFormat XML-EncodedCommand$EncodedCommand |%{$}
,其中$EncodedCommand
是上述代码段的Base64编码变体(请参见PowerShell/?
,了解如何获取它的示例)。这将产生与生成的对象相同的对象,但加载文件的shell现在不再处于活动状态。我正在尝试将程序集加载到新的AppDomain中并稍后卸载它,但它不起作用-程序集加载程序在PowerShell目录(C:/windows/system32/WindowsPowerShell/v1.0)中查找程序集即使我在创建新域时设置了基本目录…我也没有这么说!我刚试过,它锁定了那些文件。然后尝试了不同的方法,但没有成功。是的,生成新进程是这里的解决方案。您可以使用AssemblyName.GetAssemblyName
获取AssemblyName(因此是AssemblyVersion),而无需加载AssemblyName。请在您不熟悉PHP的回答中添加说明或注释,但不要将\'
转义为引号,意思是你还没有结束字符串?欢迎来到StackOverflow!您的答案需要更多关于代码如何工作的解释才能成为一个好答案。注意:这将跳过可能相关的.exe文件。我只是使用*.*