Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 获取当前目录和所有子目录中DLL文件的文件版本和程序集版本_Powershell - Fatal编程技术网

Powershell 获取当前目录和所有子目录中DLL文件的文件版本和程序集版本

Powershell 获取当前目录和所有子目录中DLL文件的文件版本和程序集版本,powershell,Powershell,我希望能够获得一个目录及其所有子目录中所有DLL文件的文件版本和程序集版本。我是编程新手,我不知道如何使这个循环工作 我使用此PowerShell代码获取程序集版本(取自论坛): 这也是: $file = Get-ChildItem -recurse | %{ $_.VersionInfo } 如何对此进行循环,以便返回目录中所有文件的程序集版本?作为难看的一行: Get-ChildItem -Filter *.dll -Recurse | ForEach-Object {

我希望能够获得一个目录及其所有子目录中所有DLL文件的文件版本和程序集版本。我是编程新手,我不知道如何使这个循环工作

我使用此PowerShell代码获取程序集版本(取自论坛):

这也是:

$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文件。我只是使用
*.*