Получить версию файла и версию сборки DLL файлов в текущем каталоге и во всех подкаталогах
Я хотел бы иметь возможность получить версию файла и версию сборки всех DLL файлов в каталоге и во всех его подкаталогах. Я новичок в программировании, и я не могу понять, как заставить этот цикл работать.
У меня есть этот код PowerShell для получения версии сборки (взятой из форума):
$strPath = 'c:\ADMLibrary.dll'
$Assembly = [Reflection.Assembly]::Loadfile($strPath)
$AssemblyName = $Assembly.GetName()
$Assemblyversion = $AssemblyName.version
И это также:
$file = Get-ChildItem -recurse | %{ $_.VersionInfo }
Как я могу сделать цикл из этого, чтобы я мог вернуть версию сборки всех файлов в каталоге?
Ответы
Ответ 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