PowerShell'deki bir .dll
veya .exe
dosyadan sürüm bilgilerini nasıl edinebilirsiniz ?
Özellikle ilgilenen am File Version
diğer sürüm bilgileri (olduğunu, olsa da, Company
, Language
, Product Name
, vb) yanı sıra yararlı olacaktır.
PowerShell'deki bir .dll
veya .exe
dosyadan sürüm bilgilerini nasıl edinebilirsiniz ?
Özellikle ilgilenen am File Version
diğer sürüm bilgileri (olduğunu, olsa da, Company
, Language
, Product Name
, vb) yanı sıra yararlı olacaktır.
Yanıtlar:
PowerShell, .NET sınıflarını çağırabildiğinden , aşağıdakileri yapabilirsiniz:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
Veya burada bir dosya listesinde belirtildiği gibi :
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
Veya bir komut dosyası olarak daha da güzel: https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
FilePrivatePart'a bakın ve FileVersion'ın son kısmıyla karşılaştırın. FileVersion, yamalı sürümü değil, orijinal olarak neyin gönderildiğini gösterir. Bu komut, diğer taraftan, gösterileri yamalı sürüm numarası: (get-komuta C: \ Windows \ System32 \ ubpm.dll) .Version
(Get-Command ... ).Version
döner ProductVersion'ın değil DosyaSürümü ve bazen bu konularda. Dolayısıyla, güncellenmiş FileVersion'ı gerçekten döndüren tam bir çözüm için , aşağıdaki cevabımdaki Update-TypeData örneğine bakın.
Günümüzde FileVersionInfo dosyasını Get-Item veya Get-ChildItem'den alabilirsiniz, ancak güncellenmiş sürümü değil, gönderilen üründen orijinal FileVersion'ı gösterecektir. Örneğin:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
İlginç bir şekilde, bunu kullanarak güncellenmiş (yamalı) ProductVersion'ı alabilirsiniz :
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
"Orijinal" ve "yamalı" arasında yaptığım ayrım, temelde FileVersion'ın hesaplanma yönteminden kaynaklanıyor ( buradaki belgelere bakın ). Temelde Vista'dan beri, Windows API GetFileVersionInfo, dilden bağımsız dosyadan (exe / dll) sürüm bilgilerinin bir kısmını ve dile özgü bir mui dosyasından (dosyalar her değiştiğinde güncellenmeyen) sabit olmayan kısmı sorgulamaktadır. ).
Dolayısıyla, lsasrv gibi bir dosyayla (Kasım 2014'te SSL / TLS / RDS'deki güvenlik sorunları nedeniyle değiştirildi) bu iki komut tarafından bildirilen sürümler (en azından bu tarihten sonra bir süre için) farklıydı ve ikincisi , daha "doğru" versiyon.
Bununla birlikte, LSASrv'de doğru olmasına rağmen, ProductVersion ve FileVersion'ın farklı olması mümkündür (aslında bu yaygındır). Dolayısıyla, güncellenmiş Fileversion'ı doğrudan montaj dosyasından almanın tek yolu, onu parçalardan kendiniz oluşturmaktır, bunun gibi bir şey:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Veya verileri buradan çekerek:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
PowerShell'deki TypeData'yı güncelleyerek bunu tüm FileInfo nesnelerine kolayca ekleyebilirsiniz:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Şimdi her yaptığınızda Get-ChildItem
veya güncellenmiş FileVersion'ı gösteren Get-Item
bir FileVersion
özelliğe sahip olacaksınız ...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
Bir dll dosyasına uygulanan ilgimi çekiyor. Etkisinden biraz bahseder misiniz?
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
cevap belgelenen aynı ProductVersion bilgi almak için bir yeni daha basit bir yolu? Microsoft'un terimi ProductVersion
tutarlı bir şekilde kullanacağına gerçekten güvenmiyorum .
'dir', bir özellik olarak VersionInfo'ya sahip dosya sisteminden çağırdığınızda System.IO.FileInfo sınıfını geri döndüren Get-ChildItem için bir takma addır. Yani ...
Tek bir dosyanın sürüm bilgisini almak için şunu yapın:
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 :
Birden fazla dosya için bu:
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
PowerShell Topluluk Uzantılarını yüklemeyi ve yalnızca sağladığı Get-FileVersionInfo işlevini kullanmayı tercih ediyorum .
Şöyle:
Get-FileVersionInfo MyAssembly.dll
aşağıdaki gibi çıktılarla:
Ürün Sürümü Dosya Sürümü Dosya Adı -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C: \ Yol \ Kime \ MyAssembly.dll
Bunu büyük bir başarı ile bütün bir toplantılar dizinine karşı kullandım.
Bunun zaten yanıtlandığını biliyorum, ancak daha az karakter yazmakla ilgilenen varsa, bunun PS v3 + 'da bunu yazmanın en kısa yolu olduğuna inanıyorum:
ls application.exe | % versioninfo
ls
için bir takma addır Get-ChildItem
%
için bir takma addır ForEach-Object
versioninfo
işte yazmanın kısa bir yolu {$_.VersionInfo}
ls
Bu şekilde kullanmanın yararı, alt klasörler içinde belirli bir dosyayı aramak için onu kolayca uyarlayabilmenizdir. Örneğin, aşağıdaki komut, application.exe
alt klasörlerde çağrılan tüm dosyalar için sürüm bilgilerini döndürür :
ls application.exe -r | % versioninfo
-r
için bir takma addır -Recurse
Arayamayacağınız -ea silentlycontinue
klasörlerdeki izin hataları gibi şeyleri yok saymak için ekleyerek bunu daha da hassaslaştırabilirsiniz :
ls application.exe -r -ea silentlycontinue | % versioninfo
-ea
için bir takma addır -ErrorAction
Son olarak, sonuçlarınızda üç nokta (...) alıyorsanız | fl
, bilgileri farklı bir biçimde döndürmek için ekleyebilirsiniz . Bu, sonuç başına bir satır yerine, bir listede biçimlendirilmiş olmasına rağmen çok daha fazla ayrıntı verir:
ls application.exe -r -ea silentlycontinue | % versioninfo | fl
fl
için bir takma addır Format-List
Bunun xcud'un yanıtına çok benzediğini ls
ve dir
her ikisinin de takma adı olduğunu anlıyorum Get-ChildItem
. Ama "en kısa" yöntemimin birine yardımcı olacağını umuyorum.
Son örnek şu şekilde uzun elle yazılabilir:
Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
... ama yolumun daha havalı ve bazıları için hatırlaması daha kolay olduğunu düşünüyorum. (Ama çoğunlukla daha soğuk).
Bunu yapmanın bir başka yolu da yerleşik dosya erişim tekniğini kullanmaktır:
(get-item .\filename.exe).VersionInfo | FL
Herhangi bir özelliği VersionInfo'dan da alabilirsiniz, böylece:
(get-item .\filename.exe).VersionInfo.FileVersion
Bu, tekniğe oldukça yakındır.
Bu, diğer cevaplara dayanıyor , ama tam olarak peşindeydim:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
Bir dll dosyasına uygulanan ilgimi çekiyor. Etkisi hakkında daha ayrıntılı bilgi verebilir misiniz (FileVersionInfo özelliğini aramadan önce)?
FileVersionInfo
exe dosyalarının yaptığı gibi içerir . Bu komutu yola uygulamak dosya sürümü bilgisini alacaktır!
Bunu yararlı buluyorum:
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
}
EBGreen'in dediği gibi, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (path) çalışacaktır, ancak FileVersionInfo'nun tüm üyelerini de alabileceğinizi unutmayın, örneğin:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
Burada belgelenen her FileVersionInfo üyesini kullanabilmelisiniz, bu da temelde dosya hakkında isteyebileceğiniz her şeyi size sağlayacaktır.
İşte alternatif bir yöntem. Sürümü seçmek için Get-WmiObject CIM_DATAFILE kullanır.
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version