162

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

に特に関心がありますが、File Version他のバージョン情報 (つまり、、、、Companyなど) も役立ちます。LanguageProduct Name

4

11 に答える 11

193

現在、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

于 2008-09-15T19:33:34.640 に答える
163

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/

于 2008-08-27T17:45:54.493 に答える
54

'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
于 2010-01-29T04:00:08.807 に答える
16

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

そのようです:

Get-FileVersionInfo MyAssembly.dll

次のような出力で:

製品バージョン ファイルバージョン ファイル名
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 C:\パス\To\MyAssembly.dll

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

于 2008-09-05T12:54:31.327 に答える
11

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

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

また、VersionInfoから特定のプロパティを取得することもできます。したがって、次のようになります。

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

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

于 2011-08-05T16:35:25.277 に答える
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
}
于 2012-07-31T12:28:40.730 に答える
4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
于 2008-08-27T17:41:59.293 に答える
2

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

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

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

于 2008-08-27T17:46:00.517 に答える