Wie können Sie die Versionsinformationen aus einer .dll
oder einer .exe
Datei in PowerShell abrufen?
Ich bin speziell interessiert ist File Version
, obwohl andere Versionsinformationen (das heißt, Company
, Language
, Product Name
, etc.) wären hilfreich , auch.
file
powershell
versioninfo
Kaiser XLII
quelle
quelle
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
das FilePrivatePart an und vergleichen Sie es mit dem letzten Teil der FileVersion. Die FileVersion zeigt, was ursprünglich ausgeliefert wurde, und nicht die gepatchte Version. Dieser Befehl zeigt andererseits die gepatchte Versionsnummer: (get-Befehl C: \ Windows \ System32 \ ubpm.dll)(Get-Command ... ).Version
die ProductVersion nicht die FileVersion zurückgibt , und manchmal ist das wichtig. Eine vollständige Lösung, die die aktualisierte FileVersion tatsächlich zurückgibt , finden Sie im Beispiel Update-TypeData in meiner Antwort unten.Heutzutage können Sie FileVersionInfo von Get-Item oder Get-ChildItem herunterladen, es wird jedoch die ursprüngliche FileVersion des gelieferten Produkts und nicht die aktualisierte Version angezeigt. Zum Beispiel:
Interessanterweise können Sie die aktualisierte (gepatchte) ProductVersion folgendermaßen herunterladen :
Die Unterscheidung, die ich zwischen "Original" und "Patched" mache, beruht im Wesentlichen auf der Art und Weise, wie die FileVersion berechnet wird ( siehe die Dokumente hier ). Grundsätzlich fragt die Windows-API GetFileVersionInfo seit Vista einen Teil der Versionsinformationen aus der sprachneutralen Datei (exe / dll) und den nicht festen Teil aus einer sprachspezifischen Mui-Datei ab (die nicht jedes Mal aktualisiert wird, wenn sich die Dateien ändern ).
Bei einer Datei wie lsasrv (die aufgrund von Sicherheitsproblemen in SSL / TLS / RDS im November 2014 ersetzt wurde) waren die von diesen beiden Befehlen gemeldeten Versionen (zumindest für eine Weile nach diesem Datum) unterschiedlich, und die zweite ist die mehr "richtige" Version.
Obwohl dies in LSASrv korrekt ist, können ProductVersion und FileVersion unterschiedlich sein (dies ist tatsächlich üblich). Die einzige Möglichkeit, die aktualisierte Dateiversion direkt aus der Baugruppendatei zu erhalten, besteht darin, sie selbst aus den Teilen zusammenzustellen.
Oder indem Sie die Daten daraus ziehen:
Sie können dies einfach zu allen FileInfo-Objekten hinzufügen, indem Sie die TypeData in PowerShell aktualisieren:
Nun jedes Mal , wenn Sie tun ,
Get-ChildItem
oderGet-Item
Sie eine habenFileVersion
Eigenschaft , dass zeigt die aktualisierte Fileversion ...quelle
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
auf eine DLL angewendeten Datei. Könnten Sie die Wirkung näher erläutern?(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
eine neuere einfachere Möglichkeit, dieselben ProductVersion-Informationen zu erhalten, die in der Antwort dokumentiert sind? Ich vertraue nicht wirklich darauf, dass Microsoft den BegriffProductVersion
konsequent verwendet.'dir' ist ein Alias für Get-ChildItem, der eine System.IO.FileInfo-Klasse zurückgibt, wenn Sie sie aus dem Dateisystem aufrufen, dessen Version VersionInfo ist. So ...
Gehen Sie folgendermaßen vor, um die Versionsinformationen einer einzelnen Datei abzurufen:
Für mehrere Dateien gilt Folgendes:
quelle
Ich bevorzuge die Installation der PowerShell Community Extensions und verwende einfach die darin enthaltene Funktion Get-FileVersionInfo.
Wie so:
mit Ausgabe wie:
Ich habe es mit großem Erfolg gegen ein ganzes Verzeichnis von Baugruppen verwendet.
quelle
Mir ist klar, dass dies bereits beantwortet wurde, aber wenn jemand daran interessiert ist, weniger Zeichen einzugeben, ist dies meiner Meinung nach die kürzeste Art, dies in PS v3 + zu schreiben:
ls
ist ein Alias fürGet-ChildItem
%
ist ein Alias fürForEach-Object
versioninfo
Hier ist eine Kurzschrift{$_.VersionInfo}
Der Vorteil
ls
dieser Verwendung besteht darin, dass Sie sie einfach anpassen können, um in Unterordnern nach einer bestimmten Datei zu suchen. Der folgende Befehl gibt beispielsweise Versionsinformationen für alle Dateien zurück, dieapplication.exe
in Unterordnern aufgerufen werden:-r
ist ein Alias für-Recurse
Sie können dies weiter verfeinern, indem Sie
-ea silentlycontinue
Dinge wie Berechtigungsfehler in Ordnern ignorieren, die Sie nicht durchsuchen können:-ea
ist ein Alias für-ErrorAction
Wenn Ihre Ergebnisse Ellipsen (...) enthalten, können Sie
| fl
die Informationen in einem anderen Format zurückgeben. Dies gibt viel mehr Details zurück, obwohl in einer Liste formatiert, anstatt in einer Zeile pro Ergebnis:fl
ist ein Alias fürFormat-List
Mir ist klar, dass dies der Antwort von xcud sehr ähnlich ist
ls
unddir
beide Aliase für sindGet-ChildItem
. Aber ich hoffe, dass meine "kürzeste" Methode jemandem hilft.Das letzte Beispiel könnte folgendermaßen in Langschrift geschrieben werden:
... aber ich denke, mein Weg ist cooler und für manche leichter zu merken. (Aber meistens cooler).
quelle
Eine andere Möglichkeit besteht darin, die integrierte Dateizugriffstechnik zu verwenden:
Sie können auch eine bestimmte Eigenschaft aus der VersionInfo abrufen, also:
Dies kommt der Dir-Technik ziemlich nahe.
quelle
Dies basiert auf den anderen Antworten, ist aber genau das, wonach ich gesucht habe:
quelle
Get-Command
auf eine DLL angewendeten Datei. Könnten Sie die Auswirkungen näher erläutern (bevor Sie die Eigenschaft FileVersionInfo aufrufen)?FileVersionInfo
genau wie exe-Dateien. Wenn Sie diesen Befehl auf den Pfad anwenden, erhalten Sie die Informationen zur Dateiversion!quelle
Ich finde das nützlich:
quelle
Wie EBGreen sagte, funktioniert [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (Pfad), aber denken Sie daran, dass Sie auch alle Mitglieder von FileVersionInfo abrufen können, zum Beispiel:
Sie sollten in der Lage sein, jedes hier dokumentierte Mitglied von FileVersionInfo zu verwenden, wodurch Sie im Grunde alles erhalten, was Sie jemals von der Datei erwarten könnten.
quelle
Hier eine alternative Methode. Es verwendet Get-WmiObject CIM_DATAFILE, um die Version auszuwählen.
quelle