Dateiversion in PowerShell abrufen
-
09-06-2019 - |
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.
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ürGet-ChildItem
%
ist ein Alias fürForEach-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ürFormat-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