Подтвердить что ты не робот

Получить версию файла и версию сборки DLL файлов в текущем каталоге и во всех подкаталогах

Я хотел бы иметь возможность получить версию файла и версию сборки всех DLL файлов в каталоге и во всех его подкаталогах. Я новичок в программировании, и я не могу понять, как заставить этот цикл работать.

У меня есть этот код PowerShell для получения версии сборки (взятой из форума):

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

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

И это также:

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

Как я могу сделать цикл из этого, чтобы я мог вернуть версию сборки всех файлов в каталоге?

4b9b3361

Ответ 1

Вот довольно один лайнер:

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

Вкратце для версии PowerShell 2:

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

Короче говоря, для версии PowerShell 3, предложенной tamasf:

ls *.dll -r | % versioninfo

Ответ 2

Как уродливый однострочный слой:

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

Ответ 3

Вот симпатичный однострочный:

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

Ответ 4

Позвольте 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

Ответ 5

Основано на ответе Джоуи, но с использованием некоторого удобного поведения для неявной обработки исключений. Сначала добавьте свойство расширения:

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, как я: мне потребовалось много времени, чтобы понять, что ответ $_ в Joey необходимо превратить в $this в определении, указанном для Update-TypeData.

Ответ 6

Одна строка сверху: Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo

Как я могу изменить его, чтобы включить *.dll, а также *.exe?

Ответ 7

$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