PowerShellでファイルバージョンを取得する


146

PowerShellの.dllまたは.exeファイルからバージョン情報を取得するにはどうすればよいですか?

私は、具体的に興味を持ってFile Version他のバージョン情報である(つまり、にもかかわらず、CompanyLanguageProduct Name、など)だけでなく、役立つだろう。

回答:


140

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/


8
.NETオブジェクトを必要としないソリューションについては、@ Jaykulを参照してください。IMHO Jaykulの回答が回答として選択されているはずです:)
Thomas Bratt

2
他の回答は短いコマンドを提供しますが、私が試したものはすべて、あまりにも多くの情報を出力し、ファイルパスを「...」に切り詰めました。この回答の2番目のコマンドは、必要なものだけを提供し、ファイルのディレクトリに対して機能し、他の情報を返すように変更する方法を簡単に確認できるようにフォーマットしています。コマンドの.LegalCopyrightを.FileVersionに変更するだけです。
Dennis

これは.NET EXEの正しいバージョンです。Jaykulの答えは同じバージョンではありません。
ashes999 2014年

それは実際には正しくありません。get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -forceFilePrivatePartを見て、FileVersionの最後の部分と比較します。FileVersionには、パッチが適用されたバージョンではなく、最初に出荷されたものが表示されます。一方、このコマンドは、パッチを適用したバージョン番号を表示します:(get-command C:\ Windows \ System32 \ ubpm.dll).Version
Jaykul

より良い例は、最近パッチを適用したC:\ Windows \ System32 \ Lsasrv.dll ...ですが、真実はFileVersionではなくProductVersion(Get-Command ... ).Version返すことです。更新された FileVersion を実際に返す完全なソリューションについては、以下の私の回答にあるUpdate-TypeDataの例を確認してください。
Jaykul 2014年

170

現在、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またはGet-Itemあなたが持っているでしょうFileVersionが示す更新ファイルバージョンという性質を...


10
そして、これをラースの承認された回答と同等にするには、次を使用します(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
rand0m1

1
Get-Commanddllファイルに適用されることに興味をそそられます。その効果について詳しく教えてください。
ステファンRolland 2014年

3
警告 FileVersionInfo.FileVersionは、最新ではない可能性がある文字列表現です。FileVersionInfo.FileMajorPart、FileMinorPart、FileBuildPart、FilePrivatePartを確認する必要があります。GetFileVersionInfo()が間違ったファイルのバージョン情報を返すのを
bdeem

1
@Jaykul以前のコメント/質問を明確にするために:ProductVersionはFileVersionよりもわかりやすいので、元の回答はPowerShellでProductVersionをいくつかの興味深い畳み込みを通して取得する方法を示しています。元の回答ではVersionInfo.ProductVersionプロパティについて言及していません。おそらく回答がその日付よりも古いためです。ある(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion答えに記載されているように同じPRODUCTVERSION情報を取得するための新しい簡単な方法は?マイクロソフトがこの用語をProductVersion一貫して使用することを本当に信じていません。
Tydaeus、

2
@Tydaeusそれは新しいものではありません。あなたはそれをドキュメントで調べて、それがどこまで遡るかを見ることができます(.NET 1.1)😏。私の回答ではProductVersionについて言及していますが、ScriptPropertyコードを使用して計算しているバージョンは、ProductVersionではなく実際のFILEバージョンです。それらは時々同じですが、常にではありません。😔そして、私はWindowsの😉の次のサービスリリースでの変更を思い付く残念ながら、すべての実際の例docs.microsoft.com/en-us/dotnet/api/...
Jaykul

50

'dir'はGet-ChildItemのエイリアスであり、VersionInfoをプロパティとして持つファイルシステムから呼び出すと、System.IO.FileInfoクラスが返されます。そう ...

1つのファイルのバージョン情報を取得するには、次のようにします。

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

他の一般的なメタデータ(会社名や説明など)も含めるのに役立ちます。
David Faivre、2011年

16

PowerShell Community Extensionsをインストールし、それが提供するGet-FileVersionInfo関数を使用することを好みます。

そのようです:

Get-FileVersionInfo MyAssembly.dll

次のような出力で:

ProductVersion FileVersion FileName
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 C:\ Path \ To \ MyAssembly.dll

アセンブリのディレクトリ全体に対して使用して、大きな成功を収めました。


12

私はこれがすでに回答されていることを理解していますが、誰かが少ない文字を入力することに興味があるなら、これが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

...しかし、私の方法はもっとクールで、覚えやすい人もいると思います。(しかし、ほとんどより涼しい)。


11

これを行うもう1つの方法は、組み込みのファイルアクセス手法を使用することです。

(get-item .\filename.exe).VersionInfo | FL

また、VersionInfoから特定のプロパティを取得することもできます。

(get-item .\filename.exe).VersionInfo.FileVersion

これは、dirテクニックに非常に近いものです。


(get-item \\ "$ computerName" \ "C $ \ Program Files \ Symantec AntiVirus \ VPDN_LU.exe")。VersionInfo.FileVersionは私のために働いた。ループからコンピューター名を追加する必要がありました。
テキーラ

7

これは他の回答に基づいていますが、まさに私が求めていたものです:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion

Get-Commanddllファイルに適用されることに興味をそそられます。(プロパティFileVersionInfoを呼び出す前に)その効果について詳しく説明してもらえますか?
ステファンRolland 2014年

dllファイルにはFileVersionInfo、exeファイルと同じように含まれています。このコマンドをパスに適用すると、ファイルバージョン情報が取得されます。
noelicus 2014年

4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

4

私はこれが便利だと思います:

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
}

これはVBScriptですか?
macetw

1
いいえ、それはpowershellです
Chriseyre2000

2

EBGreenが言ったように、[System.Diagnostics.FileVersionInfo] :: GetVersionInfo(path)は機能しますが、FileVersionInfoのすべてのメンバーを取得することもできることを覚えておいてください。例:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

ここに記載されているFileVersionInfoのすべてのメンバーを使用できるようにする必要があります。これにより、基本的にファイルについて必要なすべてのものを取得できます。


1

ここで代替方法。Get-WmiObject CIM_DATAFILEを使用してバージョンを選択します。

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version

名前にスペースを含む共有パスを使用すると、「このオブジェクトでプロパティ 'Version'が見つかりません。プロパティが存在することを確認してください。」
AnneTheAgile 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.