Domanda

Come puoi ottenere le informazioni sulla versione da a .dll O .exe file in PowerShell?

Sono particolarmente interessato a File Version, sebbene altre informazioni sulla versione (vale a dire, Company, Language, Product Name, ecc.) sarebbe utile.

È stato utile?

Soluzione

Poiché PowerShell può chiamare .NETTO lezioni, potresti fare quanto segue:

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

O come notato qui in un elenco di file:

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

O ancora più carino come script: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

Altri suggerimenti

Al giorno d'oggi è possibile ottenere FileVersionInfo da Get-Item o Get-ChildItem, ma mostrerà la FileVersion originale del prodotto spedito e non la versione aggiornata.Ad esempio:

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

È interessante notare che è possibile ottenere la versione aggiornata (patch) Versione del prodotto utilizzando questo:

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

Tieni presente che con un file come lsasrv (che è stato sostituito a causa di problemi di sicurezza in SSL/TLS/RDS nel novembre 2014) le versioni riportate da questi due comandi sono diverse e il il secondo è la versione corretta.

Tuttavia, sebbene sia corretto in LSASrv, è possibile che ProductVersion e FileVersion siano diversi (è comune, in effetti).Quindi l'unico modo per ottenere il file aggiornato Fileversion consiste nel crearlo da soli, qualcosa del genere:

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

O meglio, così:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

Adesso ogni volta che lo fai Get-ChildItem O Get-Item avrai un FileVersion proprietà che mostra la FileVersion aggiornata...

'dir' è un alias per Get-ChildItem che restituirà una classe System.IO.FileInfo quando la chiami dal filesystem che ha VersionInfo come proprietà.COSÌ ...

Per ottenere le informazioni sulla versione di un singolo file, procedi come segue:

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     :

Per più file questo:

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

Preferisco installare il Estensioni della comunità PowerShell e usa semplicemente la funzione Get-FileVersionInfo fornita.

Così:

Get-FileVersionInfo MyAssembly.dll

con output come:

ProductVersion   FileVersion      FileName
--------------   -----------      --------
1.0.2907.18095   1.0.2907.18095   C:\Path\To\MyAssembly.dll

L'ho usato contro un'intera directory di assemblee con grande successo.

Un altro modo per farlo è utilizzare la tecnica di accesso ai file integrata:

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

Puoi anche ottenere qualsiasi proprietà particolare da VersionInfo, quindi:

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

Questo è abbastanza vicino alla tecnica dir.

Mi rendo conto che a questo è già stata data una risposta, ma se qualcuno è interessato a digitare meno caratteri, credo che questo sia il modo più breve per scriverlo in PS v3+:

ls application.exe | % versioninfo
  • ls è un alias per Get-ChildItem
  • % è un alias per ForEach-Object
  • versioninfo ecco un modo di scrivere abbreviato {$_.VersionInfo}

Il vantaggio di utilizzare ls in questo modo è possibile adattarlo facilmente per cercare un determinato file all'interno delle sottocartelle.Ad esempio, il comando seguente restituirà informazioni sulla versione per tutti i file chiamati application.exe all'interno delle sottocartelle:

ls application.exe -r | % versioninfo
  • -r è un alias per -Recurse

Puoi perfezionarlo ulteriormente aggiungendo -ea silentlycontinue per ignorare cose come errori di autorizzazione nelle cartelle in cui non puoi cercare:

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea è un alias per -ErrorAction

Infine, se nei risultati vengono visualizzati dei puntini di sospensione (...), è possibile aggiungere | fl per restituire le informazioni in un formato diverso.Ciò restituisce molti più dettagli, sebbene formattati in un elenco, anziché su una riga per risultato:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl è un alias per Format-List

Mi rendo conto che questo è molto simile alla risposta di xcud in questo ls E dir sono entrambi alias di Get-ChildItem.Ma spero che il mio metodo "più breve" possa aiutare qualcuno.

L'esempio finale potrebbe essere scritto a mano lunga nel modo seguente:

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

...ma penso che il mio modo sia più bello e, per alcuni, più facile da ricordare.(Ma soprattutto più bello).

Questo è basato dall'altro risponde, ma è esattamente quello che cercavo:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

Trovo utile questo:

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
}

Come ha detto EBGreen, [System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) funzionerà, ma ricorda che puoi anche ottenere tutti i membri di FileVersionInfo, ad esempio:

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

Dovresti essere in grado di utilizzare tutti i membri di FileVersionInfo documentati qui, il che ti darà praticamente tutto ciò che potresti desiderare sul file.

Ecco un metodo alternativo.Utilizza Get-WmiObject CIM_DATAFILE per selezionare la versione.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top