2008-08-27 21 views
97

Jak uzyskać informacje o wersji z pliku .dll lub .exe w PowerShell?Pobierz wersję pliku w PowerShell

jestem specjalnie zainteresowany File Version, choć inne informacje o wersji (czyli Company, Language, Product Name, itd.) Byłby pomocny.

Odpowiedz

93

Ponieważ PowerShell można wywołać .NET klas, można wykonać następujące czynności:

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

lub jako noted here na liście plików:

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

Albo nawet ładniejszy jako skrypt: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

+8

Zobacz @Jaykul dla rozwiązania, które nie wymaga obiektu .NET. Odpowiedź IMHO Jaykula powinna być wybrana jako odpowiedź :) –

+1

Mimo że pozostałe odpowiedzi dają krótsze polecenia, wszystkie te, które próbowałem, wypisują za dużo informacji i skracają ścieżkę pliku do "...". Drugie polecenie w tej odpowiedzi daje dokładnie to, czego potrzebujesz, działa dla katalogu plików i formatuje się w taki sposób, aby łatwo było go zmodyfikować w celu zwrócenia innych informacji. Po prostu zmień .LegalCopyright w poleceniu na .FileVersion. – Dennis

+2

Nawiasem mówiąc, link "odnotowano tutaj" jest martwy. –

4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll") 
2

Jak powiedział EBGreen, [System.Diagnostics.FileVe rsionInfo] :: GetVersionInfo (ścieżka) będzie działać, ale należy pamiętać, że można również uzyskać wszystkich członków FileVersionInfo, na przykład:

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

Powinieneś być w stanie wykorzystać każdy członek FileVersionInfo udokumentowany tutaj, który dostanie w zasadzie wszystko, co możesz chcieć o pliku.

14

Preferuję zainstalować PowerShell Community Extensions i po prostu użyć funkcji Get-FileVersionInfo, którą zapewnia.

tak:

Get-FileVersionInfo MyAssembly.dll

z wyjściem jak:

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

Używałem go na całego katalogu zespołów z wielkim sukcesem.

+0

Podoba mi się ta odpowiedź. :-) –

125

W dzisiejszych czasach można uzyskać FileVersionInfo z Get-Item lub Get-ChildItem, ale wyświetli oryginalną wersję pliku z wysyłanego produktu, a nie zaktualizowaną wersję. Na przykład:

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

Co ciekawe, można uzyskać zaktualizowaną (poprawioną) ProductVersion za pomocą tego:

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

Należy zauważyć, że z pliku jak LSASRV (który został zamieniony z powodu problemów związanych z bezpieczeństwem w SSL/TLS/RDS w listopadzie 2014 r.) Wersje zgłoszone przez te dwie komendy są inne, a druga druga wersja jest poprawną wersją.

Jednakże, mimo że jest poprawne w LSASrv, możliwe jest, że ProductVersion i FileVersion są różne (tak naprawdę jest to typowe).Więc jedynym sposobem, aby uzyskać aktualizowane FileVersion jest zbudować go samemu, coś takiego:

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

czy raczej coś takiego:

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 robisz Get-ChildItem lub Get-Item będziesz mieć właściwość FileVersion, która pokazuje zaktualizowany plik FileVersion ...

+10

Aby uczynić to odpowiednikiem akceptowanej przez Larsa odpowiedzi, użyj po prostu '(Get-Command C: \ Path \ YourFile.Dll) .FileVersionInfo.FileVersion' – rand0m1

+0

Intryguje mnie "Get-Command" zastosowane do pliku dll. Czy mógłbyś rozwinąć swój efekt? –

+0

No cóż, w dawnych czasach FileInfo nie posiadało właściwości ScriptProperty "VersionInfo", tak jak teraz, ale obiekt ApplicationInfo zwrócony przez Get-Command zawierał "ScriptVision" FileVersionInfo (który jest taki sam jak VersionInfo, który jest w FileInfo obiekty w nowszych wersjach PowerShell). – Jaykul

35

'dir' jest aliasem dla Get-ChildItem, który zwróci klasę System.IO.FileInfo, gdy jesteś wywoływanie go z systemu plików, który ma właściwość VersionInfo. Więc ...

Aby uzyskać informacje o wersji z pojedynczego pliku to zrobić:

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  : 

wielu plików to:

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 
+0

Pomocne w dodawaniu innych powszechnych metadanych (np. Nazwa i opis firmy). –

10

tylko inny sposób to zrobić jest użycie wbudowanego -W technika dostępu do plików:

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

można również uzyskać jakiejkolwiek nieruchomości off o wersji, a więc:

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

To jest dość blisko techniki dir.

+0

pracował dla mnie jak urok! – shaiss

+0

(get-item \\ "$ nazwa_komputera" \ "C $ \ Program Files \ Symantec AntiVirus \ VPDN_LU.exe") Dla mnie działa wersjaInfo.FileVersion. Musiałem dodać nazwę komputera z pętli. – Tequila

2

Uważam to za 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 
} 
+0

Czy to jest VBScript? – macetw

+1

Nie to jest muszla – Chriseyre2000

7

to oparty na inne odpowiedzi, ale jest dokładnie to, co było po:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion 
+0

Jestem zaintrygowany o 'Get-Command' zastosowanym do pliku dll. Czy mógłbyś rozwinąć swój efekt (zanim jeszcze zadzwonisz do właściwości FileVersionInfo)? –

+0

pliki dll zawierają 'FileVersionInfo', tak jak robią to pliki exe. Zastosowanie tego polecenia do ścieżki spowoduje wyświetlenie informacji o wersji pliku! – noelicus

0

Oto alternatywna metoda. Używa Get-WmiObject CIM_DATAFILE, aby wybrać wersję.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version 
+0

przy użyciu ścieżki udostępniania ze spacjami w nazwie, otrzymałem "Właściwość" Wersja "nie można znaleźć na tym obiekcie. Sprawdź, czy właściwość istnieje." – AnneTheAgile