आजकल आप Get-Item या Get-ChildItem से FileVersionInfo प्राप्त कर सकते हैं, लेकिन यह शिप किए गए उत्पाद से मूल FileVersion को दिखाएगा, और अपडेट किए गए संस्करण को नहीं। उदाहरण के लिए:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
दिलचस्प है, आप इस का उपयोग करके अद्यतन (पैच किए गए) ProductVersion प्राप्त कर सकते हैं :
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
मूल रूप से "मूल" और "पैच" के बीच जो अंतर किया जा रहा है, वह मूल रूप से फाइलवर्सन की गणना करने के तरीके के कारण है ( यहां डॉक्स देखें )। मूल रूप से विस्टा के बाद से, Windows API GetFileVersionInfo भाषा तटस्थ फ़ाइल (exe / dll) से संस्करण जानकारी का एक हिस्सा क्वेरी कर रहा है और एक भाषा-विशिष्ट mui फ़ाइल से गैर-निश्चित भाग (जो हर बार फ़ाइलों को अद्यतन नहीं किया जाता है) )।
तो lsasrv जैसी फाइल के साथ (जो नवंबर 2014 में SSL / TLS / RDS में सुरक्षा समस्याओं के कारण बदल गया) इन दो कमांडों द्वारा रिपोर्ट किए गए संस्करण (कम से कम कुछ समय के लिए उस तारीख के बाद) अलग थे, और दूसरा एक है अधिक "सही" संस्करण।
हालाँकि, हालांकि यह LSASrv में सही है, यह ProductVersion और FileVersion के लिए अलग होना संभव है (यह वास्तव में, सामान्य है)। तो असेंबली फ़ाइल से सीधे अपडेटेड फाइलवर्सन को प्राप्त करने का एकमात्र तरीका यह है कि इसे कुछ हिस्सों से खुद बनाया जाए, कुछ इस तरह से:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
या इससे डेटा खींचकर:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
PowerShell में TypeData को अपडेट करके आप इसे आसानी से सभी FileInfo ऑब्जेक्ट में जोड़ सकते हैं:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
अब हर बार जब आप करते हैं Get-ChildItem
या Get-Item
आपके पास एक FileVersion
संपत्ति होगी जो अद्यतन की गई FileVersion को दिखाती है ...