2008-08-27 30 views
97

Làm cách nào để bạn có thể lấy thông tin phiên bản từ tệp .dll hoặc .exe trong PowerShell?Tải phiên bản tệp trong PowerShell

Tôi đặc biệt quan tâm đến File Version, mặc dù thông tin phiên bản khác (nghĩa là, Company, Language, Product Name, v.v.) cũng sẽ hữu ích.

Trả lời

93

Kể từ PowerShell có thể gọi .NET lớp học, bạn có thể làm như sau:

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

Hoặc như noted here vào một danh sách các tập tin:

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

Hoặc thậm chí đẹp hơn như một kịch bản: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

+8

Xem @Jaykul cho giải pháp không yêu cầu đối tượng .NET. Câu trả lời của IMHO Jaykul nên được chọn làm câu trả lời :) –

+1

Mặc dù các câu trả lời khác cung cấp các lệnh ngắn hơn, tất cả những câu trả lời tôi đã thử in ra quá nhiều thông tin và cắt bớt đường dẫn tệp thành "...". Lệnh thứ 2 trong câu trả lời này chỉ cung cấp những gì bạn cần, làm việc cho một thư mục các tệp và định dạng theo cách dễ dàng để xem cách sửa đổi nó để trả về thông tin khác. Chỉ cần thay đổi .LegalCopyright trong lệnh thành .FileVersion. – Dennis

+2

Ngẫu nhiên, liên kết "ghi chú ở đây" đã chết. –

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

Như EBGreen đã nói, [System.Diagnostics.FileVe rsionInfo] :: GetVersionInfo (đường dẫn) sẽ làm việc, nhưng hãy nhớ rằng bạn cũng có thể nhận được tất cả các thành viên của FileVersionInfo, ví dụ:

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

Bạn sẽ có thể sử dụng tất cả các thành viên của FileVersionInfo tài liệu ở đây, mà sẽ nhận được bạn về cơ bản bất cứ điều gì bạn có thể muốn về tập tin.

14

Tôi thích cài đặt PowerShell Community Extensions và chỉ sử dụng chức năng Get-FileVersionInfo mà nó cung cấp.

Giống như vậy:

Get-FileVersionInfo MyAssembly.dll

với sản lượng như:

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

Tôi đã sử dụng nó chống lại toàn bộ thư mục của hội với thành công rực rỡ.

+0

Tôi thích câu trả lời đó. :-) –

125

Ngày nay bạn có thể lấy FileVersionInfo từ Get-Item hoặc Get-ChildItem, nhưng nó sẽ hiển thị FileVersion gốc từ sản phẩm được vận chuyển chứ không phải phiên bản cập nhật. Ví dụ:

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

Điều thú vị là bạn có thể nhận được cập nhật (vá) ProductVersion bằng cách sử dụng này:

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

Lưu ý rằng với một tập tin như LSASRV (mà bị thay thế do các vấn đề an ninh trong SSL/TLS/RDS vào tháng 11 năm 2014) các phiên bản được báo cáo bởi hai lệnh này khác nhau và phiên bản thứ hai là phiên bản chính xác.

Tuy nhiên, mặc dù nó chính xác trong LSASrv, nhưng ProductVersion và FileVersion có thể khác nhau (thông thường, trên thực tế).Vì vậy, cách duy nhất để có được những cập nhật FileVersion là xây dựng nó lên chính mình, một cái gì đó như thế này:

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

Hay đúng hơn, như thế này:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value { 
    [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % { 
     [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
    } 
} 

Bây giờ mỗi khi bạn làm Get-ChildItem hay Get-Item bạn sẽ có một thuộc tính FileVersion hiển thị FileVersion được cập nhật ...

+10

Và để làm điều này tương đương với câu trả lời được chấp nhận của Lars, chỉ cần sử dụng '(Get-Command C: \ Path \ YourFile.Dll) .ileVersionInfo.FileVersion' – rand0m1

+0

Tôi tò mò về 'Get-Command' được áp dụng cho một tệp dll. Bạn có thể giải thích về hiệu quả của nó? –

+0

Vâng, trong những ngày cũ FileInfo đã không có một "VersionInfo" ScriptProperty như nó hiện nay, nhưng đối tượng ApplicationInfo trả về bởi Get-Command bao gồm một "FileVersionInfo" ScriptProperty (giống như VersionInfo trên FileInfo trong các phiên bản PowerShell mới hơn). – Jaykul

35

'dir' là bí danh cho Get-ChildItem sẽ trả về lớp System.IO.FileInfo khi bạn gọi nó từ hệ thống tập tin có VersionInfo là thuộc tính. Vì vậy, ...

Để có được thông tin phiên bản của một tập tin duy nhất làm được điều này:

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  : 

Đối với nhiều file này:

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

Hữu ích ở chỗ bạn cũng bao gồm các dữ liệu meta phổ biến khác (như tên công ty và mô tả). –

10

Chỉ cần một cách khác để làm điều đó là sử dụng xây dựng trong kỹ thuật truy cập tệp:

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

Bạn cũng có thể nhận được bất kỳ thuộc tính cụ thể nào khỏi VersionInfo, như vậy:

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

Điều này khá gần với kỹ thuật dir.

+0

làm việc như một sự quyến rũ đối với tôi! – shaiss

+0

(get-item \\ "$ computerName" \ "C $ \ Program Files \ Symantec AntiVirus \ VPDN_LU.exe"). VersionInfo.FileVersion làm việc cho tôi. Tôi cần thêm tên máy tính từ một vòng lặp. – Tequila

2

Tôi tìm thấy điều này hữu ích:

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

Đây có phải là VBScript không? – macetw

+1

Không có quyền hạn nào của nó – Chriseyre2000

7

này được dựa trên câu trả lời khác, nhưng là chính xác những gì tôi đã sau:

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

Tôi bị hấp dẫn về lệnh 'Get-Command' được áp dụng cho một tệp dll. Bạn có thể giải thích về hiệu ứng của nó (thậm chí trước khi gọi cho thuộc tính FileVersionInfo) không? –

+0

tệp dll chứa 'FileVersionInfo' giống như tệp exe. Áp dụng lệnh này vào đường dẫn sẽ nhận được thông tin phiên bản tệp! – noelicus

0

Dưới đây là một phương pháp thay thế. Nó sử dụng Get-WmiObject CIM_DATAFILE để chọn phiên bản.

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

sử dụng đường dẫn chia sẻ có dấu cách trong tên, tôi nhận được "Thuộc tính 'Phiên bản' không thể tìm thấy trên đối tượng này. Hãy xác minh rằng thuộc tính tồn tại". – AnneTheAgile

Các vấn đề liên quan