回答:
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/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
FilePrivatePartを見て、FileVersionの最後の部分と比較します。FileVersionには、パッチが適用されたバージョンではなく、最初に出荷されたものが表示されます。一方、このコマンドは、パッチを適用したバージョン番号を表示します:(get-command C:\ Windows \ System32 \ ubpm.dll).Version
(Get-Command ... ).Version
返すことです。更新された FileVersion を実際に返す完全なソリューションについては、以下の私の回答にあるUpdate-TypeDataの例を確認してください。
現在、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
が示す更新ファイルバージョンという性質を...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
dllファイルに適用されることに興味をそそられます。その効果について詳しく教えてください。
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
答えに記載されているように同じPRODUCTVERSION情報を取得するための新しい簡単な方法は?マイクロソフトがこの用語をProductVersion
一貫して使用することを本当に信じていません。
'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
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
アセンブリのディレクトリ全体に対して使用して、大きな成功を収めました。
私はこれがすでに回答されていることを理解していますが、誰かが少ない文字を入力することに興味があるなら、これが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
...しかし、私の方法はもっとクールで、覚えやすい人もいると思います。(しかし、ほとんどより涼しい)。
これを行うもう1つの方法は、組み込みのファイルアクセス手法を使用することです。
(get-item .\filename.exe).VersionInfo | FL
また、VersionInfoから特定のプロパティを取得することもできます。
(get-item .\filename.exe).VersionInfo.FileVersion
これは、dirテクニックに非常に近いものです。
これは他の回答に基づいていますが、まさに私が求めていたものです:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
dllファイルに適用されることに興味をそそられます。(プロパティFileVersionInfoを呼び出す前に)その効果について詳しく説明してもらえますか?
FileVersionInfo
、exeファイルと同じように含まれています。このコマンドをパスに適用すると、ファイルバージョン情報が取得されます。
私はこれが便利だと思います:
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