Jak uzyskać informacje o wersji z pliku .dll
lub .exe
w programie PowerShell?
Jestem szczególnie zainteresowany File Version
, chociaż inne informacje o wersji (czyli Company
, Language
, Product Name
, itd.) Byłby pomocny.
file
powershell
versioninfo
Cesarz XLII
źródło
źródło
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
i porównaj FilePrivatePart z ostatnią częścią FileVersion. FileVersion pokazuje, co zostało pierwotnie wysłane, a nie poprawioną wersję. Z drugiej strony to polecenie pokazuje numer poprawionej wersji: (get-command C: \ Windows \ System32 \ ubpm.dll).(Get-Command ... ).Version
zwraca ProductVersion, a nie FileVersion , i czasami ma to znaczenie. Aby uzyskać pełne rozwiązanie, które faktycznie zwraca zaktualizowaną wersję pliku, zapoznaj się z przykładem Update-TypeData w mojej odpowiedzi poniżej.Obecnie możesz pobrać FileVersionInfo z Get-Item lub Get-ChildItem, ale pokaże on oryginalny plik FileVersion z dostarczonego produktu, a nie zaktualizowaną wersję. Na przykład:
Co ciekawe, zaktualizowaną (załataną) wersję ProductVersion można pobrać za pomocą tego:
Rozróżnienie, które robię między „oryginalnym” i „załatanym”, wynika zasadniczo ze sposobu obliczania FileVersion ( zobacz dokumentację tutaj ). Zasadniczo od czasu Vista, GetFileVersionInfo API systemu Windows odpytuje część informacji o wersji z pliku neutralnego językowo (exe / dll), a nie naprawioną część z pliku mui specyficznego dla języka (który nie jest aktualizowany za każdym razem, gdy zmieniają się pliki ).
Tak więc w przypadku pliku takiego jak lsasrv (który został zastąpiony z powodu problemów z bezpieczeństwem w SSL / TLS / RDS w listopadzie 2014 r.) Wersje zgłaszane przez te dwie komendy (przynajmniej przez chwilę po tej dacie) były różne, a druga to bardziej „poprawna” wersja.
Jednak chociaż jest to poprawne w LSASrv, możliwe jest, że ProductVersion i FileVersion będą różne (w rzeczywistości jest to powszechne). Tak więc jedynym sposobem uzyskania zaktualizowanej wersji Fileversion bezpośrednio z pliku zespołu jest samodzielne zbudowanie jej z części, coś takiego:
Lub pobierając dane z tego:
Możesz łatwo dodać to do wszystkich obiektów FileInfo, aktualizując TypeData w PowerShell:
Teraz za każdym razem, gdy to zrobisz,
Get-ChildItem
lubGet-Item
będziesz miećFileVersion
właściwość, która pokazuje zaktualizowaną wersję pliku ...źródło
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
zastosowanym do pliku dll. Czy mógłbyś wyjaśnić jego efekt?(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
nowszy, prostszy sposób na uzyskanie tych samych informacji o ProductVersion, jak opisano w odpowiedzi? Nie ufam firmie Microsoft wProductVersion
konsekwentnym używaniu tego terminu .„dir” jest aliasem dla Get-ChildItem, który zwróci klasę System.IO.FileInfo, gdy wywołujesz ją z systemu plików, który ma VersionInfo jako właściwość. Więc ...
Aby uzyskać informacje o wersji pojedynczego pliku, wykonaj następujące czynności:
W przypadku wielu plików:
źródło
Wolę zainstalować rozszerzenia społeczności PowerShell i po prostu użyć funkcji Get-FileVersionInfo, którą zapewnia.
Tak jak to:
z wyjściem takim jak:
Użyłem go przeciwko całemu katalogowi zestawów z wielkim sukcesem.
źródło
Zdaję sobie sprawę, że już na to odpowiedziano, ale jeśli ktoś jest zainteresowany wpisaniem mniejszej liczby znaków, uważam, że jest to najkrótszy sposób napisania tego w PS v3 +:
ls
jest aliasem dlaGet-ChildItem
%
jest aliasem dlaForEach-Object
versioninfo
tutaj jest skrótowy sposób pisania{$_.VersionInfo}
Zaletą używania
ls
w ten sposób jest to, że można go łatwo dostosować do wyszukiwania danego pliku w podfolderach. Na przykład poniższe polecenie zwróci informacje o wersji dla wszystkich plików wywoływanychapplication.exe
w podfolderach:-r
jest aliasem dla-Recurse
Możesz to dodatkowo uściślić, dodając,
-ea silentlycontinue
aby ignorować takie rzeczy, jak błędy uprawnień w folderach, których nie możesz przeszukiwać:-ea
jest aliasem dla-ErrorAction
Wreszcie, jeśli otrzymujesz wielokropki (...) w wynikach, możesz dołączyć,
| fl
aby zwrócić informacje w innym formacie. Zwraca to znacznie więcej szczegółów, mimo że jest sformatowane w formie listy, a nie w jednym wierszu na wynik:fl
jest aliasem dlaFormat-List
Zdaję sobie sprawę, że jest to bardzo podobne do odpowiedzi xcud pod tym względem
ls
idir
oba są aliasami dlaGet-ChildItem
. Ale mam nadzieję, że moja „najkrótsza” metoda komuś pomoże.Ostatni przykład można napisać odręcznie w następujący sposób:
... ale myślę, że moja droga jest fajniejsza i dla niektórych łatwiejsza do zapamiętania. (Ale głównie fajniejsze).
źródło
Innym sposobem jest użycie wbudowanej techniki dostępu do plików:
Możesz również pobrać określoną właściwość z VersionInfo, a zatem:
Jest to dość zbliżone do techniki reż.
źródło
Jest to oparte na innych odpowiedziach, ale dokładnie o to mi chodziło:
źródło
Get-Command
zastosowanym do pliku dll. Czy mógłbyś bardziej szczegółowo opisać jego efekt (jeszcze przed wywołaniem właściwości FileVersionInfo)?FileVersionInfo
tak samo, jak pliki exe. Zastosowanie tego polecenia do ścieżki spowoduje uzyskanie informacji o wersji pliku!źródło
Uważam, że to przydatne:
źródło
Jak powiedział EBGreen, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (ścieżka) będzie działać, ale pamiętaj, że możesz również pobrać wszystkie elementy członkowskie FileVersionInfo, na przykład:
Powinieneś być w stanie użyć każdego członka FileVersionInfo udokumentowanego tutaj, co da ci w zasadzie wszystko, czego możesz chcieć w pliku.
źródło
Tutaj alternatywna metoda. Używa Get-WmiObject CIM_DATAFILE do wyboru wersji.
źródło