PowerShell でファイルのバージョンを取得する
-
09-06-2019 - |
質問
バージョン情報を取得するにはどうすればよいですか? .dll
または .exe
PowerShellでファイルを作成しますか?
特に興味があるのは File Version
, ただし、他のバージョン情報 (つまり、 Company
, Language
, Product Name
, 、など)も参考になります。
解決
PowerShell は呼び出すことができるので、 。ネット クラスでは、次のことができます。
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
またはとして ここにメモした ファイルのリストについて:
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
または、スクリプトとしてさらに優れています: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry
他のヒント
現在では、Get-Item または Get-ChildItem から FileVersionInfo を取得できますが、更新されたバージョンではなく、出荷された製品の元の FileVersion が表示されます。例えば:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
興味深いことに、更新された(パッチが適用された)ものを入手できます。 製品バージョン これを使用して:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
lsasrv のようなファイル (2014 年 11 月に SSL/TLS/RDS のセキュリティ問題により置き換えられました) では、これら 2 つのコマンドによって報告されるバージョンが異なることに注意してください。 二つ目 は正しいバージョンです。
ただし、LSASrv では正しくても、ProductVersion と FileVersion が異なる可能性があります (実際、これは一般的です)。したがって、それを入手する唯一の方法は、 更新しました Fileversion は、次のように自分でビルドすることです。
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
というか、次のようになります。
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
または Get-Item
あなたは持っています FileVersion
更新された FileVersion を示すプロパティ ...
「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 コミュニティ拡張機能 そして、提供されている Get-FileVersionInfo 関数を使用するだけです。
そのようです:
Get-FileVersionInfo MyAssembly.dll
次のような出力になります:
ProductVersion FileVersion FileName -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C:\Path\To\MyAssembly.dll
私はこれをアセンブリのディレクトリ全体に対して使用しましたが、大きな成功を収めました。
もう 1 つの方法は、組み込みのファイル アクセス手法を使用することです。
(get-item .\filename.exe).VersionInfo | FL
次のように、VersionInfo から特定のプロパティを取得することもできます。
(get-item .\filename.exe).VersionInfo.FileVersion
これは dir 手法に非常に近いです。
これはすでに回答されていると思いますが、入力する文字数を減らしたい人がいる場合は、これが PS v3+ でこれを記述する最短の方法であると思います。
ls application.exe | % versioninfo
ls
のエイリアスですGet-ChildItem
%
のエイリアスですForEach-Object
versioninfo
ここに簡略的な書き方があります{$_.VersionInfo}
使用するメリット ls
このようにすると、サブフォルダー内の特定のファイルを検索するように簡単に調整できるようになります。たとえば、次のコマンドは、という名前のすべてのファイルのバージョン情報を返します。 application.exe
サブフォルダー内:
ls application.exe -r | % versioninfo
-r
のエイリアスです-Recurse
を追加することでこれをさらに調整できます -ea silentlycontinue
検索できないフォルダー内の権限エラーなどを無視するには、次のようにします。
ls application.exe -r -ea silentlycontinue | % versioninfo
-ea
のエイリアスです-ErrorAction
最後に、結果に省略記号 (...) が表示される場合は、次のように追加できます。 | fl
情報を別の形式で返します。これは、結果ごとに 1 行ではなく、リスト形式でフォーマットされていますが、より詳細な情報を返します。
ls application.exe -r -ea silentlycontinue | % versioninfo | fl
fl
のエイリアスですFormat-List
これは、xcud の回答と非常に似ていることに気づきました。 ls
そして dir
どちらも次のエイリアスです Get-ChildItem
. 。しかし、私の「最短」の方法が誰かの役に立つことを願っています。
最後の例は、次のように手書きで書くことができます。
Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
...しかし、私のやり方のほうがクールで、人によっては覚えやすいと思います。(しかし、ほとんどは涼しいです)。
これは ベースの 他の回答にもありますが、まさに私が求めていたものです:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
これは便利だと思います:
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
}
EBGreen が述べたように、 [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) は機能しますが、次のように FileVersionInfo のすべてのメンバーを取得することもできることに注意してください。
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
ここに記載されている FileVersionInfo のすべてのメンバーを使用できるはずです。これにより、基本的にファイルに関して必要なものはすべて取得できます。
ここで代替方法を説明します。Get-WmiObject CIM_DATAFILE を使用してバージョンを選択します。
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version