Получить версию файла и версию сборки файлов DLL в текущем каталоге и во всех подкаталогах - PullRequest
38 голосов
/ 16 июля 2010

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

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

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

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

И это также:

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

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

Ответы [ 6 ]

57 голосов
/ 30 сентября 2012

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

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

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

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

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

ls *.dll -r | % versioninfo
32 голосов
/ 17 июля 2010

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

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 голосов
/ 28 ноября 2017

Вот одна строчка:

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
1 голос
/ 06 сентября 2018

Пусть 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
0 голосов
/ 23 января 2019

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

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.

0 голосов
/ 16 ноября 2018
$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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...