Ngày nay, bạn có thể nhận 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
Thật thú vị, bạn có thể nhận được ProductVersion được cập nhật (đã vá) bằng cách sử dụng:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
Sự khác biệt mà tôi tạo ra giữa "bản gốc" và "bản vá" về cơ bản là do cách tính FileVersion ( xem các tài liệu ở đây ). Về cơ bản kể từ Vista, API Windows GetFileVersionInfo đang truy vấn một phần thông tin phiên bản từ tệp trung lập ngôn ngữ (exe / dll) và phần không cố định từ tệp mui xe cụ thể (không được cập nhật mỗi khi tệp thay đổi ).
Vì vậy, với một tệp như lsasrv (đã bị thay thế do sự cố bảo mật 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 (ít nhất là trong một thời gian sau ngày đó) là khác nhau và thứ hai là phiên bản "chính xác" hơn.
Tuy nhiên, mặc dù điều đó đúng trong LSASrv, nhưng ProductVersion và FileVersion có thể khác nhau (thực tế là nó phổ biến). Vì vậy, cách duy nhất để có được Fileversion được cập nhật trực tiếp từ tệp lắp ráp là tự xây dựng nó từ các bộ phận, đại loại như thế này:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Hoặc bằng cách lấy dữ liệu từ đây:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Bạn có thể dễ dàng thêm phần này vào tất cả các đối tượng FileInfo bằng cách cập nhật TypeData trong PowerShell:
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
hoặc Get-Item
bạn sẽ có một thuộc FileVersion
tính hiển thị FileVersion được cập nhật ...