質問

バージョン情報を取得するにはどうすればよいですか? .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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top