Jak uzyskać informacje o wersji z pliku .dlllub .exew programie PowerShell?
Jestem szczególnie zainteresowany File Version, chociaż inne informacje o wersji (czyli Company, Language, Product Name, itd.) Byłby pomocny.
Jak uzyskać informacje o wersji z pliku .dlllub .exew programie PowerShell?
Jestem szczególnie zainteresowany File Version, chociaż inne informacje o wersji (czyli Company, Language, Product Name, itd.) Byłby pomocny.
Odpowiedzi:
Ponieważ PowerShell może wywoływać klasy .NET , możesz wykonać następujące czynności:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
Lub jak zaznaczono tutaj na liście plików:
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
Lub nawet ładniejszy jako skrypt: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -forcei 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 ... ).Versionzwraca 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:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
Co ciekawe, zaktualizowaną (załataną) wersję ProductVersion można pobrać za pomocą tego:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
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:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Lub pobierając dane z tego:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Możesz łatwo dodać to do wszystkich obiektów FileInfo, aktualizując TypeData w PowerShell:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Teraz za każdym razem, gdy to zrobisz, Get-ChildItemlub Get-Itembędziesz mieć FileVersionwłaściwość, która pokazuje zaktualizowaną wersję pliku ...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Commandzastosowanym do pliku dll. Czy mógłbyś wyjaśnić jego efekt?
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersionnowszy, prostszy sposób na uzyskanie tych samych informacji o ProductVersion, jak opisano w odpowiedzi? Nie ufam firmie Microsoft w ProductVersionkonsekwentnym 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:
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 :
W przypadku wielu plików:
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
Wolę zainstalować rozszerzenia społeczności PowerShell i po prostu użyć funkcji Get-FileVersionInfo, którą zapewnia.
Tak jak to:
Get-FileVersionInfo MyAssembly.dll
z wyjściem takim jak:
ProductVersion FileVersion FileName -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C: \ Path \ To \ MyAssembly.dll
Użyłem go przeciwko całemu katalogowi zestawów z wielkim sukcesem.
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 application.exe | % versioninfo
ls jest aliasem dla Get-ChildItem% jest aliasem dla ForEach-Objectversioninfo tutaj jest skrótowy sposób pisania {$_.VersionInfo}Zaletą używania lsw 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ływanych application.exew podfolderach:
ls application.exe -r | % versioninfo
-r jest aliasem dla -RecurseMożesz to dodatkowo uściślić, dodając, -ea silentlycontinueaby ignorować takie rzeczy, jak błędy uprawnień w folderach, których nie możesz przeszukiwać:
ls application.exe -r -ea silentlycontinue | % versioninfo
-ea jest aliasem dla -ErrorActionWreszcie, jeśli otrzymujesz wielokropki (...) w wynikach, możesz dołączyć, | flaby 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:
ls application.exe -r -ea silentlycontinue | % versioninfo | fl
fl jest aliasem dla Format-ListZdaję sobie sprawę, że jest to bardzo podobne do odpowiedzi xcud pod tym względem lsi diroba są aliasami dla Get-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:
Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
... ale myślę, że moja droga jest fajniejsza i dla niektórych łatwiejsza do zapamiętania. (Ale głównie fajniejsze).
Innym sposobem jest użycie wbudowanej techniki dostępu do plików:
(get-item .\filename.exe).VersionInfo | FL
Możesz również pobrać określoną właściwość z VersionInfo, a zatem:
(get-item .\filename.exe).VersionInfo.FileVersion
Jest to dość zbliżone do techniki reż.
Jest to oparte na innych odpowiedziach, ale dokładnie o to mi chodziło:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Commandzastosowanym do pliku dll. Czy mógłbyś bardziej szczegółowo opisać jego efekt (jeszcze przed wywołaniem właściwości FileVersionInfo)?
FileVersionInfotak samo, jak pliki exe. Zastosowanie tego polecenia do ścieżki spowoduje uzyskanie informacji o wersji pliku!
Uważam, że to przydatne:
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
}
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:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
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.
Tutaj alternatywna metoda. Używa Get-WmiObject CIM_DATAFILE do wyboru wersji.
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version