পাওয়ারশেলে ফাইল সংস্করণ পান


146

আপনি কীভাবে পাওয়ারশেলের কোনও ফাইল .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-inifications/


8
একটি সমাধানের জন্য @ জয়কুল দেখুন যাতে কোনও নেট নেট অবজেক্টের প্রয়োজন হয় না। আইএমএইচও জাইকুলের প্রতিক্রিয়াটি উত্তর হিসাবে বেছে নেওয়া উচিত ছিল :)
টমাস ব্র্যাট

2
যদিও অন্যান্য উত্তরগুলি সংক্ষিপ্ত কমান্ড দেয়, তবে আমি যেগুলি চেষ্টা করেছি সেগুলির সবকটিই খুব বেশি তথ্য প্রিন্ট করার চেষ্টা করে এবং "..." এ ফাইলের পথটি ছিন্ন করে। এই উত্তরের ২ য় কমান্ড আপনার যা প্রয়োজন ঠিক তা দেয়, ফাইলের ডিরেক্টরিতে কাজ করে এবং এমনভাবে ফর্ম্যাট করে যা অন্যান্য তথ্য ফিরে আসার জন্য কীভাবে এটি পরিবর্তন করতে হয় তা সহজেই দেখা যায়। কমান্ডের মধ্যে। লেগেলকপিটাইট .FileVersion এ পরিবর্তন করুন।
ডেনিস

এটি নেট এক্সের জন্য সঠিক সংস্করণ। জাইকুলের উত্তর একই সংস্করণ পায় না।
ashes999

আসলে এটি ঠিক নয়। get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -forceফাইল সংস্করণটির শেষ অংশের সাথে ফাইলপ্রাইভেট পার্টটি দেখুন এবং তুলনা করুন। ফাইলভিশনটি মূলত কী পাঠানো হয়েছে তা দেখায়, এবং প্যাচ করা সংস্করণটি নয়। এই কমান্ডের অন্যদিকে, শো তালি সংস্করণ সংখ্যা: (পেতে-কমান্ড সি: \ উইন্ডোজ \ সিস্টেম 32 \ ubpm.dll) .Version
Jaykul

এর চেয়ে উত্তম উদাহরণ হ'ল সাম্প্রতিক প্যাচ করা সি: \ উইন্ডোজ \ সিস্টেম 32 \ লসাসরভ.ডিএল ... তবে সত্যটি হ'ল ফাইল ভার্শনটি না করে প্রোডাক্ট সংস্করণটি(Get-Command ... ).Version ফিরিয়ে দেয় এবং কখনও কখনও এটি গুরুত্বপূর্ণ। সুতরাং এমন একটি সম্পূর্ণ সমাধানের জন্য যা বাস্তবে আপডেট হওয়া ফাইল ভার্সনটি দেয়, নীচে আমার উত্তরে আপডেট-টাইপডেটা উদাহরণটি দেখুন।
জয়কুল

170

আজকাল আপনি গেট-আইটেম বা গেট-চাইল্ড আইটেম থেকে ফাইল ভার্সনআইনফো পেতে পারেন তবে এটি শিপড পণ্য থেকে মূল ফাইল ভার্সনটি প্রদর্শন করবে এবং আপডেট সংস্করণ নয়। এই ক্ষেত্রে:

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

মজার বিষয় হল আপনি এটি ব্যবহার করে আপডেট (প্যাচযুক্ত) প্রোডাক্ট ভার্সন পেতে পারেন :

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

"আসল" এবং "প্যাচড" এর মধ্যে আমি যে পার্থক্যটি তৈরি করছি তা মূলত ফাইল ভার্সন গণনা করার কারণে ( এখানে ডক্সগুলি দেখুন )। মূলত ভিস্টার পর থেকেই, উইন্ডোজ এপিআই গেটফাইলে ভার্সইনফো ভাষা নিরপেক্ষ ফাইল (উদাহরণ / dll) থেকে সংস্করণ তথ্যের অংশ এবং ভাষা-নির্দিষ্ট মুই ফাইলের অ-স্থির অংশটি অনুসন্ধান করছে (যা প্রতিবার ফাইলগুলি পরিবর্তিত হয় না )।

সুতরাং lsasrv এর মতো ফাইলের সাথে (যা নভেম্বর ২০১৪-এ এসএসএল / টিএলএস / আরডিএসে সুরক্ষার সমস্যার কারণে প্রতিস্থাপন হয়েছিল) এই দুটি কমান্ডের দ্বারা বর্ণিত সংস্করণগুলি (কমপক্ষে সেই তারিখের পরে কিছু সময়ের জন্য) আলাদা ছিল এবং দ্বিতীয়টি হ'ল আরও "সঠিক" সংস্করণ।

তবে এটি এলএসএএসআরভি-তে সঠিক হলেও, প্রোডাক্ট ভার্সন এবং ফাইল ভার্সিয়নের পক্ষে আলাদা হওয়া সম্ভব (বাস্তবে এটি সাধারণ)। সুতরাং অ্যাসেম্বলি ফাইল থেকে সরাসরি আপডেট হওয়া ফাইল রূপান্তর পাওয়ার একমাত্র উপায় হ'ল অংশ থেকে নিজেকে তৈরি করা, এরকম কিছু:

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

অথবা এ থেকে ডেটা টেনে:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)

আপনি পাওয়ারশেলের টাইপডাটা আপডেট করে খুব সহজেই সমস্ত ফাইলআইএনফোতে যুক্ত করতে পারেন:

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সম্পত্তি থাকবে যা আপডেট করা ফাইল সংস্করণ দেখায় ...


10
এবং এটিকে লার্সের গৃহীত উত্তরের সমতুল্য করতে, কেবল ব্যবহার করুন(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
rand0m1

1
আমি Get-Commandএকটি dll ফাইল প্রয়োগ সম্পর্কে আগ্রহী । আপনি এর প্রভাব সম্পর্কে বিস্তারিত বলতে পারেন?
স্টিফেন রোল্যান্ড

3
ফাইল ভার্সনআইএনফো-ফাইলে ভার্সন সতর্কতা একটি স্ট্রিং প্রতিনিধিত্ব যা আপ টু ডেট নাও হতে পারে। আপনি ফাইল ভার্সনআইএনফো.ফিলমজোরপার্ট, ফাইলমিনোরপার্ট, ফাইলবিল্ড পার্ট, ফাইলপ্রাইভেট পার্টের দিকে নজর দেওয়া উচিত। দেখুন GetFileVersionInfo () ফেরৎ ভুল ফাইল এর সংস্করণ তথ্য
bdeem

1
@ জয়কুল আমার আগের মন্তব্য / প্রশ্নটি পরিষ্কার করতে: আসল উত্তরটি দেখায় যে কীভাবে কিছু আকর্ষণীয় কনভলিউশনের মাধ্যমে পাওয়ারশেলের প্রোডাক্ট ভার্সন পাবেন, কারণ প্রোডাক্ট ভার্সন ফাইল ভার্সনের চেয়ে আরও বেশি সূচক হতে পারে। মূল উত্তরটি সংস্করণআইফোন.প্রডাক্ট ভার্সন সম্পত্তি সম্পর্কে কোনও উল্লেখ করে না, সম্ভবত কারণ উত্তরটি পূর্ব-তারিখেই রয়েছে। (Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersionউত্তরে নথিভুক্ত একই প্রোডাক্ট ভার্সন তথ্য পাওয়ার কি আরও সহজ সরল উপায়? মাইক্রোসফ্ট সত্যই এই শব্দটি ProductVersionধারাবাহিকভাবে ব্যবহার করতে বিশ্বাস করি না ।
টাইডিয়াস

2
@ টিডিউস এটি নতুন নয় আপনি এটি ডক্সে সন্ধান করতে পারেন এবং এটি কত পিছনে চলেছে তা দেখতে পারেন (। নেট 1.1) 😏 😏 আমার উত্তরে প্রোডাক্ট ভার্সনের উল্লেখ রয়েছে, তবে যে সমস্ত সংস্করণ আমরা সেই সমস্ত স্ক্রিপ্টপ্র্টি কোড দিয়ে গণনা করছি তা হ'ল প্রকৃত ফাইল সংস্করণ, প্রোডাক্ট ভার্সন নয়। এগুলি কখনও কখনও একই হয় তবে সর্বদা হয় না। 😔 এবং দুর্ভাগ্যবশত, যে বাস্তব বিশ্বের উদাহরণ আমি উইন্ডোজের পরের সেবা রিলিজে পরিবর্তনের সঙ্গে আসা 😉 docs.microsoft.com/en-us/dotnet/api/...
Jaykul

50

'দির' হ'ল গেট-চাইল্ড আইটেমের একটি উপনাম যা কোনও সিস্টেম হিসাবে ফিরে আসবে O তাই ...

একটি একক ফাইলের সংস্করণ তথ্য পেতে এটি করুন:

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

আমি পাওয়ারশেল সম্প্রদায় এক্সটেনশানগুলি ইনস্টল করতে পছন্দ করি এবং এটি সরবরাহ করে যে get-FileVersionInfo ফাংশনটি ব্যবহার করে।

তাই ভালো:

গেট-ফাইল ভার্সনআইনফো মাইআস্যাবুলেশন.ডিল

আউটপুট যেমন:

প্রোডাক্ট ভার্সন ফাইল ভার্সন ফাইলনাম
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 সি: \ পথ \ থেকে \ MyAsorses.dll

আমি এটি দুর্দান্ত সাফল্যের সাথে সমাবেশগুলির একটি সম্পূর্ণ ডিরেক্টরি বিরুদ্ধে ব্যবহার করেছি।


12

আমি বুঝতে পেরেছি এর জবাব ইতিমধ্যে দেওয়া হয়েছে, তবে কারও যদি কম চরিত্র টাইপ করতে আগ্রহী, আমি বিশ্বাস করি এটি PS 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আলাদা ফর্ম্যাটে তথ্য ফেরত দিতে যোগ করতে পারেন। এটি ফলাফলের এক লাইনে পরিবর্তে একটি তালিকায় ফর্ম্যাট থাকলেও এটি আরও বেশি বিবরণ দেয় returns

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl জন্য একটি উপনাম Format-List

আমি বুঝতে পেরেছি যে এটি এক্সকুডের জবাবের সাথে খুব মিল lsএবং dirএটি উভয়ই উপমা Get-ChildItem। তবে আমি আশা করছি আমার "সংক্ষিপ্ততম" পদ্ধতিটি কাউকে সহায়তা করবে।

চূড়ান্ত উদাহরণটি নিম্নরূপে নিম্নরূপে লেখা যেতে পারে:

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

... তবে আমি মনে করি আমার পথটি শীতল এবং কিছুটির পক্ষে মনে রাখা সহজ। (তবে বেশিরভাগ শীতল)


11

এটি করার আরও একটি উপায় হ'ল বিল্ট-ইন ফাইল অ্যাক্সেস কৌশলটি ব্যবহার করা:

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

আপনি ভার্শনআইএনফো থেকে কোনও নির্দিষ্ট সম্পত্তি পেতে পারেন:

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

এটি দির কৌশলটির বেশ কাছাকাছি।


(get-item \\ "$ ComputerName" \ "C $ \ প্রোগ্রাম ফাইলগুলি man Symantec AntiVirus \ VPDN_LU.exe") Version ভার্সনআইএনফো Fফিলভিশনটি আমার পক্ষে কাজ করেছে। আমার একটি লুপ থেকে একটি কম্পিউটারের নাম যুক্ত করা দরকার।
টকিলা

7

এটি অন্যান্য উত্তরের উপর ভিত্তি করে তৈরি হয়েছে তবে আমি ঠিক পরে যা করেছি:

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

আমি Get-Commandএকটি dll ফাইল প্রয়োগ সম্পর্কে আগ্রহী । আপনি কি এর প্রভাব সম্পর্কে বিস্তারিত বলতে পারেন (এমনকি ফাইলভারভিশনআইএনফো সম্পত্তিটি কল করার আগে)?
স্টিফেন রোল্যান্ড

dll ফাইলগুলিতে FileVersionInfoযেমন এক্স ফাইল থাকে তেমন থাকে । এই কমান্ডটি পথে ব্যবহার করলে ফাইল সংস্করণ সম্পর্কিত তথ্য পাওয়া যাবে!
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
}

এটি কি ভিবিএস স্ক্রিপ্ট?
macetw

1
না এটি পাওয়ারশেল
Chriseyre2000

2

ইবিগ্রিন যেমন বলেছে, [সিস্টেম.ডায়াগনস্টিক্স.ফাইলে সংস্করণআইফোন] :: getVersionInfo (পাথ) কাজ করবে তবে মনে রাখবেন যে আপনি ফাইল ভার্সনআইএনফো-র সমস্ত সদস্যও পেতে পারেন, উদাহরণস্বরূপ:

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

আপনার এখানে ডকুমেন্টেড ফাইল ভার্সনআইএনফো-র প্রতিটি সদস্যকে ব্যবহার করতে সক্ষম হওয়া উচিত, যা আপনাকে মূলত ফাইল সম্পর্কে যা চাইবে এমন কিছু পাবেন।


1

এখানে একটি বিকল্প পদ্ধতি। এটি সংস্করণ নির্বাচন করতে get-WmiObject CIM_DATAFILE ব্যবহার করে।

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

নামে ফাঁকা জায়গায় শেয়ার পথ ব্যবহার করে, আমি পেয়েছি "সম্পত্তি 'সংস্করণ' এই বস্তুটিতে পাওয়া যাবে না object সম্পত্তিটি রয়েছে কিনা তা যাচাই করুন" "
অ্যানি দ্য অ্যাজিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.