Frage

Wie können Sie die Versionsinformationen von a erhalten? .dll oder .exe Datei in PowerShell?

Ich interessiere mich speziell für File Version, obwohl andere Versionsinformationen (d. h. Company, Language, Product Name, usw.) wäre ebenfalls hilfreich.

War es hilfreich?

Lösung

Da PowerShell aufrufen kann .NETZ Klassen könnten Sie Folgendes tun:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion

Oder als hier vermerkt auf einer Liste von Dateien:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

Oder noch schöner als Drehbuch: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

Andere Tipps

Heutzutage können Sie die FileVersionInfo von Get-Item oder Get-ChildItem abrufen, es wird jedoch die ursprüngliche FileVersion des ausgelieferten Produkts und nicht die aktualisierte Version angezeigt.Zum Beispiel:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion

Interessanterweise können Sie die aktualisierte (gepatchte) Version erhalten. Produktversion indem Sie Folgendes verwenden:

(Get-Command C:\Windows\System32\Lsasrv.dll).Version

Beachten Sie, dass bei einer Datei wie lsasrv (die aufgrund von Sicherheitsproblemen in SSL/TLS/RDS im November 2014 ersetzt wurde) die von diesen beiden Befehlen gemeldeten Versionen unterschiedlich sind und die das Zweite ist die richtige Version.

Obwohl es in LSASrv korrekt ist, ist es jedoch möglich, dass ProductVersion und FileVersion unterschiedlich sind (was tatsächlich häufig vorkommt).Also der einzige Weg, das zu bekommen Aktualisiert Fileversion besteht darin, es selbst zu erstellen, etwa so:

Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part

Oder besser gesagt so:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

Jetzt jedes Mal, wenn Sie es tun Get-ChildItem oder Get-Item Du wirst eine haben FileVersion Eigenschaft, die die aktualisierte FileVersion anzeigt ...

„dir“ ist ein Alias ​​für Get-ChildItem, das eine System.IO.FileInfo-Klasse zurückgibt, wenn Sie sie aus dem Dateisystem aufrufen, das VersionInfo als Eigenschaft hat.Also ...

Um die Versionsinformationen einer einzelnen Datei zu erhalten, gehen Sie wie folgt vor:

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     :

Für mehrere Dateien gilt Folgendes:

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

Ich bevorzuge die Installation PowerShell-Community-Erweiterungen und verwenden Sie einfach die von ihr bereitgestellte Get-FileVersionInfo-Funktion.

Etwa so:

Get-FileVersionInfo MyAssembly.dll

mit Ausgabe wie:

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

Ich habe es mit großem Erfolg für ein ganzes Verzeichnis von Baugruppen verwendet.

Eine weitere Möglichkeit besteht darin, die integrierte Dateizugriffstechnik zu verwenden:

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

Sie können jede bestimmte Eigenschaft auch aus der VersionInfo abrufen, also:

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

Dies kommt der Dir-Technik ziemlich nahe.

Mir ist klar, dass dies bereits beantwortet wurde, aber wenn jemand daran interessiert ist, weniger Zeichen einzugeben, glaube ich, dass dies der kürzeste Weg ist, dies in PS v3+ zu schreiben:

ls application.exe | % versioninfo
  • ls ist ein Alias ​​für Get-ChildItem
  • % ist ein Alias ​​für ForEach-Object
  • versioninfo Hier ist eine Kurzschreibweise {$_.VersionInfo}

Der Vorteil der Verwendung ls Auf diese Weise können Sie es leicht anpassen, um in Unterordnern nach einer bestimmten Datei zu suchen.Der folgende Befehl gibt beispielsweise Versionsinformationen für alle aufgerufenen Dateien zurück application.exe innerhalb von Unterordnern:

ls application.exe -r | % versioninfo
  • -r ist ein Alias ​​für -Recurse

Sie können dies durch Hinzufügen weiter verfeinern -ea silentlycontinue So ignorieren Sie Dinge wie Berechtigungsfehler in Ordnern, die Sie nicht durchsuchen können:

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea ist ein Alias ​​für -ErrorAction

Wenn Ihre Ergebnisse schließlich Ellipsen (...) enthalten, können Sie diese anhängen | fl um die Informationen in einem anderen Format zurückzugeben.Dies gibt viel mehr Details zurück, obwohl es in einer Liste formatiert ist und nicht in einer Zeile pro Ergebnis:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl ist ein Alias ​​für Format-List

Mir ist klar, dass dies der Antwort von xcud in dieser Hinsicht sehr ähnlich ist ls Und dir sind beide Aliase für Get-ChildItem.Aber ich hoffe, dass meine „kürzeste“ Methode jemandem hilft.

Das letzte Beispiel könnte in Langschrift wie folgt geschrieben werden:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

...Aber ich denke, mein Weg ist cooler und für manche leichter zu merken.(Aber meistens cooler).

Das ist basierend auf den anderen Antworten, ist aber genau das, wonach ich gesucht habe:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

Ich finde das nützlich:

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
}

Wie EBGreen sagte, wird [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) funktionieren, aber denken Sie daran, dass Sie auch alle Mitglieder von FileVersionInfo abrufen können, zum Beispiel:

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

Sie sollten in der Lage sein, jedes hier dokumentierte Mitglied von FileVersionInfo zu verwenden, wodurch Sie im Grunde alles erhalten, was Sie sich jemals über die Datei wünschen können.

Hier eine alternative Methode.Es verwendet Get-WmiObject CIM_DATAFILE, um die Version auszuwählen.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top