PowerShell में फ़ाइल संस्करण प्राप्त करें


146

आप PowerShell में किसी संस्करण .dllया .exeफ़ाइल से संस्करण की जानकारी कैसे प्राप्त कर सकते हैं ?

मैं विशेष रूप में दिलचस्पी है File Version, हालांकि अन्य संस्करण जानकारी (यह है कि, Company, Language, Product Name, आदि) में अच्छी तरह से उपयोगी होगा।

जवाबों:


140

चूंकि पावरशेल .NET क्लासेस को कॉल कर सकता है, आप निम्न कार्य कर सकते हैं:

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

या जैसा कि यहां फाइलों की सूची में उल्लेखित है :

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

या यहां तक ​​कि एक स्क्रिप्ट के रूप में अच्छे: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/


8
किसी समाधान के लिए @Jaykul देखें जो .NET ऑब्जेक्ट की आवश्यकता नहीं है। IMHO जयकुल की प्रतिक्रिया को उत्तर के रूप में चुना जाना चाहिए था :)
थॉमस ब्राट

2
हालाँकि अन्य उत्तर छोटी आज्ञा देते हैं, लेकिन जिन सभी को मैंने बहुत अधिक जानकारी देने की कोशिश की है और फ़ाइल पथ को "..." में काट दिया है। इस उत्तर में 2 कमांड आपको केवल वही देता है जो आपको चाहिए, फाइलों की एक निर्देशिका के लिए काम करता है, और इस तरह से स्वरूपण कर रहा है कि यह देखना आसान है कि इसे कैसे संशोधित करें अन्य जानकारी वापस करने के लिए। बस .LegalCopyright को कमांड में बदल कर .FileVersion पर रखें।
डेनिस

यह .NET EXEs के लिए सही संस्करण है। जयकुल के उत्तर का एक ही संस्करण नहीं मिलता है।
ashes999

यह वास्तव में सही नहीं है। पर देखो get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -forceऔर FileVersion के अंतिम भाग के लिए FilePrivatePart की तुलना करें। FileVersion दिखाता है कि मूल रूप से क्या भेजा गया है, और पैच किए गए संस्करण नहीं। दूसरी ओर, यह कमांड पैच वर्जन नंबर दिखाता है: (get-command C: \ Windows \ System32 \ ubpm.dll) ।Version
Jaykul

एक बेहतर उदाहरण हाल ही में समझौता किया जाएगा \ Windows \ System32 \ Lsasrv.dll: सी ... लेकिन सच्चाई यह है कि है (Get-Command ... ).Versionरिटर्न ProductVersion नहीं FileVersion , और कभी कभी कि मायने रखती है। तो एक पूर्ण समाधान के लिए जो वास्तव में अद्यतन किए गए FileVersion को लौटाता है, नीचे दिए गए मेरे उत्तर में Update-TypeData उदाहरण देखें।
जयकुल

170

आजकल आप 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 को दिखाती है ...


10
और यह लार्स 'स्वीकार किए जाते हैं जवाब के बराबर करने के लिए, बस का उपयोग(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
rand0m1

1
मैं Get-Commandएक dll फ़ाइल के लिए लागू के बारे में साज़िश कर रहा हूँ । क्या आप इसके प्रभाव के बारे में विस्तार से बता सकते हैं?
स्टीफन रोलैंड

3
चेतावनी FileVersionInfo.FileVersion एक स्ट्रिंग प्रतिनिधित्व है जो आज तक नहीं हो सकता है। आपको FileVersionInfo.FileMajorPart, FileMinorPart, FileBuildPart, FilePStreetPart को देखना चाहिए। GetFileVersionInfo
bdeem

1
@ जेकुल मेरे पहले की टिप्पणी / प्रश्न को स्पष्ट करने के लिए: मूल उत्तर दर्शाता है कि कुछ दिलचस्प संकल्पों के माध्यम से PowerShell में ProductVersion कैसे प्राप्त करें, क्योंकि FileVersion की तुलना में ProductVersion अधिक संकेत हो सकता है। मूल उत्तर वर्जनइन्फो.प्रोडर्वेशन प्रॉपर्टी का कोई उल्लेख नहीं करता है, संभवतः क्योंकि इसका उत्तर प्री-डेट होता है। है (Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersionएक नए सरल तरीके के रूप में इस सवाल का जवाब में दर्ज ही ProductVersion जानकारी पाने के लिए? मैं वास्तव में ProductVersionलगातार शब्द का उपयोग करने के लिए Microsoft पर भरोसा नहीं करता ।
Tydaeus

2
@ टेडेयस यह नया नहीं है। आप इसे डॉक्स पर देख सकते हैं और देख सकते हैं कि यह कितना पीछे चला जाता है (.NET 1.1) on। मेरे उत्तर में ProductVersion का उल्लेख है, लेकिन हम जिस संस्करण की सभी ScriptProperty कोड के साथ गणना कर रहे हैं, वह असली FILE संस्करण है, ProductVersion नहीं। वे कभी-कभी समान होते हैं, लेकिन हमेशा नहीं। 😔 और दुर्भाग्य से, प्रत्येक वास्तविक दुनिया का उदाहरण मैं विंडोज की अगली सेवा के रिलीज में बदलाव के साथ आता हूं ,। डॉक्स.मेडिसिन.com
Jaykul

50

'dir' Get-ChildItem के लिए एक उपनाम है जो एक System.IO.FileInfo वर्ग को वापस करेगा जब आप इसे फाइलसिस्टम से कॉल कर रहे हैं जिसमें एक संपत्ति के रूप में VersionInfo है। इसलिए ...

किसी एकल फ़ाइल का संस्करण जानकारी प्राप्त करने के लिए यह करें:

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     :

कई फ़ाइलों के लिए यह:

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

इसमें मददगार आप अन्य सामान्य मेटा डेटा (जैसे कंपनी का नाम और विवरण) शामिल करते हैं।
डेविड फेविरे

16

मैं PowerShell सामुदायिक एक्सटेंशन इंस्टॉल करना पसंद करता हूं और बस Get-FileVersionInfo फ़ंक्शन का उपयोग करता हूं जो इसे प्रदान करता है।

इस तरह:

Get-FileVersionInfo MyAssembly.dll

जैसे आउटपुट के साथ:

ProductVersion FileVersion फ़ाइल नाम
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 C: \ Path \ To \ MyAssembly.dll

मैंने इसे बड़ी सफलता के साथ विधानसभाओं की पूरी निर्देशिका के खिलाफ इस्तेमाल किया है।


12

मुझे लगता है कि यह पहले ही उत्तर दिया जा चुका है, लेकिन अगर किसी को कम वर्ण लिखने में दिलचस्पी है, तो मेरा मानना ​​है कि पीएस v3 + में इसे लिखने का यह सबसे छोटा तरीका है:

ls application.exe | % versioninfo
  • ls के लिए एक उपनाम है Get-ChildItem
  • % के लिए एक उपनाम है ForEach-Object
  • versioninfo यहाँ लेखन का एक संक्षिप्त तरीका है {$_.VersionInfo}

lsइस तरह से उपयोग करने का लाभ यह है कि आप आसानी से इसे सबफ़ोल्डर्स के भीतर दिए गए फ़ाइल के लिए देख सकते हैं। उदाहरण के लिए, निम्न आदेश application.exeसबफ़ोल्डर्स के भीतर कहे जाने वाली सभी फ़ाइलों के लिए संस्करण जानकारी लौटाएगा :

ls application.exe -r | % versioninfo
  • -r के लिए एक उपनाम है -Recurse

आप उन -ea silentlycontinueचीज़ों को अनदेखा करके जोड़ सकते हैं जिन्हें आप खोज नहीं सकते, जैसे कि फ़ोल्डर में अनुमति त्रुटियां:

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea के लिए एक उपनाम है -ErrorAction

अंत में, यदि आप अपने परिणामों में दीर्घवृत्त (...) प्राप्त कर रहे हैं, तो आप | flएक अलग प्रारूप में जानकारी वापस करने के लिए अपील कर सकते हैं । यह अधिक विवरण देता है, हालांकि एक सूची में स्वरूपित किया गया है, बल्कि प्रति पंक्ति एक पंक्ति में:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl के लिए एक उपनाम है Format-List

मुझे लगता है कि यह xcud के जवाब से काफी मिलता-जुलता है lsऔर dirइसके लिए दोनों उपनाम हैं Get-ChildItem। लेकिन मुझे उम्मीद है कि मेरी "सबसे छोटी" विधि किसी की मदद करेगी।

अंतिम उदाहरण निम्नलिखित तरीके से लंबे हाथों में लिखा जा सकता है:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

... लेकिन मुझे लगता है कि मेरा रास्ता ठंडा है और, कुछ के लिए, याद रखना आसान है। (लेकिन ज्यादातर कूलर)।


11

इसका दूसरा तरीका यह है कि बिल्ट-इन फाइल एक्सेस तकनीक का उपयोग किया जाए:

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

आप किसी भी विशेष संस्करण VersionInfo से प्राप्त कर सकते हैं, इस प्रकार:

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

यह डायर तकनीक के काफी करीब है।


(get-item \\ "$ computerName" \ "C $ \ Program Files \ Symantec AntiVirus \ VPDN_LU.exe")। VersionInfo.FileVersion ने मेरे लिए काम किया। मुझे लूप से कंप्यूटर का नाम जोड़ने की आवश्यकता थी।
टकीला

7

यह अन्य उत्तरों पर आधारित है, लेकिन वास्तव में मैं इसके बाद क्या था:

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

मैं Get-Commandएक dll फ़ाइल के लिए लागू के बारे में साज़िश कर रहा हूँ । क्या आप इसके प्रभाव (संपत्ति FileVersionInfo के लिए कॉल करने से पहले) के बारे में विस्तार से बता सकते हैं?
स्टीफन रोलैंड

dll फ़ाइलें FileVersionInfoजैसे exe फ़ाइलें करती हैं। इस कमांड को पथ पर लागू करने से फ़ाइल संस्करण की जानकारी मिल जाएगी!
noelicus


4

मुझे यह उपयोगी लगता है:

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
}

क्या यह VBScript है?
22

1
नहीं, यह
पॉवरशेल है

2

जैसा कि EBGreen ने कहा, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (पथ) काम करेगा, लेकिन याद रखें कि आप FileVersionInfo के सभी सदस्यों को भी प्राप्त कर सकते हैं, उदाहरण के लिए:

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

आप यहाँ दर्ज FileVersionInfo के प्रत्येक सदस्य का उपयोग करने में सक्षम होना चाहिए, जो आपको मूल रूप से कुछ भी मिलेगा जो आप कभी भी फ़ाइल के बारे में चाह सकते हैं।


1

यहाँ एक वैकल्पिक तरीका है। यह संस्करण का चयन करने के लिए Get-WmiObject CIM_DATAFILE का उपयोग करता है।

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

नाम में रिक्त स्थान के साथ एक साझा पथ का उपयोग करते हुए, मुझे "संपत्ति 'संस्करण' इस वस्तु पर नहीं मिल सकता है। सत्यापित करें कि संपत्ति मौजूद है।"
ऐनीअगाइल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.