PowerShell でファイルからバージョン情報を取得するにはどうすればよいです.dll
か?.exe
に特に関心がありますが、File Version
他のバージョン情報 (つまり、、、、Company
など) も役立ちます。Language
Product Name
PowerShell でファイルからバージョン情報を取得するにはどうすればよいです.dll
か?.exe
に特に関心がありますが、File Version
他のバージョン情報 (つまり、、、、Company
など) も役立ちます。Language
Product Name
現在、Get-Item または Get-ChildItem から FileVersionInfo を取得できますが、更新されたバージョンではなく、出荷された製品の元の FileVersion が表示されます。例えば:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
興味深いことに、これを使用して、更新された (パッチが適用された) ProductVersionを取得できます。
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
私が「オリジナル」と「パッチ適用済み」を区別しているのは、基本的に FileVersion の計算方法によるものです (こちらのドキュメントを参照してください)。基本的に Vista 以降、Windows API の GetFileVersionInfo は、言語に依存しないファイル (exe/dll) からのバージョン情報の一部と、言語固有の mui ファイル (ファイルが変更されるたびに更新されない) からの固定されていない部分を照会しています。 )。
そのため、lsasrv のようなファイル (2014 年 11 月に SSL/TLS/RDS のセキュリティ上の問題により置き換えられました) では、これら 2 つのコマンドによって報告されるバージョン (少なくともその日付からしばらくの間) が異なり、2 つ目のファイルはより「正しい」バージョン。
ただし、LSASrv では正しくても、ProductVersion と FileVersion が異なる可能性があります (実際にはよくあることです)。したがって、更新されたFileversion をアセンブリ ファイルから直接取得する唯一の方法は、次のようにパーツから自分でビルドすることです。
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
または、これからデータを取得することによって:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
PowerShell で TypeData を更新することにより、これをすべての FileInfo オブジェクトに簡単に追加できます。
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Get-ChildItem
そうするたびに、更新された FileVersion を示すプロパティが表示されますGet-Item
...FileVersion
PowerShell は.NETクラスを呼び出すことができるため、次の操作を実行できます。
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
または、ファイルのリストでここに記載されているように:
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
または、スクリプトとしてさらに優れています: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/
'dir' は Get-ChildItem のエイリアスで、プロパティとして VersionInfo を持つファイルシステムから呼び出すときに System.IO.FileInfo クラスを返します。そう ...
単一のファイルのバージョン情報を取得するには、次のようにします。
PS C:\Windows> (dir .\write.exe).VersionInfo | fl
OriginalFilename : write
FileDescription : Windows Write
ProductName : Microsoft® Windows® Operating System
Comments :
CompanyName : Microsoft Corporation
FileName : C:\Windows\write.exe
FileVersion : 6.1.7600.16385 (win7_rtm.090713-1255)
ProductVersion : 6.1.7600.16385
IsDebug : False
IsPatched : False
IsPreRelease : False
IsPrivateBuild : False
IsSpecialBuild : False
Language : English (United States)
LegalCopyright : © Microsoft Corporation. All rights reserved.
LegalTrademarks :
PrivateBuild :
SpecialBuild :
複数のファイルの場合:
PS C:\Windows> dir *.exe | %{ $_.VersionInfo }
ProductVersion FileVersion FileName
-------------- ----------- --------
6.1.7600.16385 6.1.7600.1638... C:\Windows\bfsvc.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\explorer.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\fveupdate.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\HelpPane.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\hh.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\notepad.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\regedit.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\splwow64.exe
1,7,0,0 1,7,0,0 C:\Windows\twunk_16.exe
1,7,1,0 1,7,1,0 C:\Windows\twunk_32.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\winhlp32.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\write.exe
私は、PowerShell Community Extensionsをインストールして、それが提供する Get-FileVersionInfo 関数を使用することを好みます。
そのようです:
Get-FileVersionInfo MyAssembly.dll
次のような出力で:
製品バージョン ファイルバージョン ファイル名 -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C:\パス\To\MyAssembly.dll
私はそれをアセンブリのディレクトリ全体に対して使用して大きな成功を収めました。
これを行うもう1つの方法は、組み込みのファイルアクセス手法を使用することです。
(get-item .\filename.exe).VersionInfo | FL
また、VersionInfoから特定のプロパティを取得することもできます。したがって、次のようになります。
(get-item .\filename.exe).VersionInfo.FileVersion
これはdirテクニックに非常に近いです。
これは便利だと思います:
function Get-Version($filePath)
{
$name = @{Name="Name";Expression= {split-path -leaf $_.FileName}}
$path = @{Name="Path";Expression= {split-path $_.FileName}}
dir -recurse -path $filePath | % { if ($_.Name -match "(.*dll|.*exe)$") {$_.VersionInfo}} | select FileVersion, $name, $path
}
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
EBGreen が言ったように、[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) は機能しますが、FileVersionInfo のすべてのメンバーを取得することもできることを覚えておいてください。次に例を示します。
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
ここに記載されている FileVersionInfo のすべてのメンバーを使用できるはずです。これにより、基本的に、ファイルについて必要なすべてのものを取得できます。