Obtener la versión del archivo en PowerShell

¿Cómo puede obtener la información de la versión de un archivo .dll o .exe en PowerShell?

Estoy específicamente interesado en la File Version , aunque también sería útil otra información de la versión (es decir, Company , Language , Product Name , etc.).

Dado que PowerShell puede llamar a clases .NET , puede hacer lo siguiente:

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

O como se indica aquí en una lista de archivos:

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

O incluso mejor como script: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

Hoy en día puede obtener FileVersionInfo de Get-Item o Get-ChildItem, pero mostrará FileVersion original del producto enviado, y no la versión actualizada. Por ejemplo:

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

Curiosamente, puede obtener la versión de producto actualizada (parcheada) al usar esto:

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

Tenga en cuenta que con un archivo como lsasrv (que se reemplazó debido a problemas de seguridad en SSL / TLS / RDS en noviembre de 2014), las versiones informadas por estos dos comandos son diferentes y la segunda es la correcta.

Sin embargo, aunque es correcto en LSASrv, es posible que ProductVersion y FileVersion sean diferentes (es común, de hecho). Entonces, la única manera de obtener la versión de archivo actualizada es crearla usted mismo, algo como esto:

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

O más bien, así:

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

Ahora, cada vez que realice Get-ChildItem o Get-Item , tendrá una propiedad FileVersion que muestra la FileVersion actualizada …

‘dir’ es un alias para Get-ChildItem que devolverá una clase System.IO.FileInfo cuando lo está llamando desde el sistema de archivos que tiene VersionInfo como una propiedad. Asi que …

Para obtener la información de versión de un solo archivo, haga esto:

 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 : 

Para múltiples archivos esto:

 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 

Prefiero instalar las extensiones de comunidad de PowerShell y simplemente uso la función Get-FileVersionInfo que proporciona.

Al igual que:

  Get-FileVersionInfo MyAssembly.dll 

con salida como:

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

Lo he usado contra un directorio completo de ensamblajes con gran éxito.

Otra forma de hacerlo es usar la técnica de acceso a archivos incorporada:

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

También puede obtener cualquier propiedad particular de VersionInfo, por lo tanto:

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

Esto es bastante cercano a la técnica dir.

Esto se basa en las otras respuestas, pero es exactamente lo que estaba buscando:

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

Me doy cuenta de que esto ya ha sido respondido, pero si alguien está interesado en escribir menos caracteres, creo que esta es la forma más corta de escribir esto en PS v3 +:

 ls application.exe | % versioninfo 
  • ls es un alias para Get-ChildItem
  • % es un alias para ForEach-Object
  • versioninfo aquí es una forma abreviada de escribir {$_.VersionInfo}

El beneficio de usar ls de esta manera es que puede adaptarlo fácilmente para buscar un archivo determinado dentro de las subcarpetas. Por ejemplo, el siguiente comando devolverá información de versión para todos los archivos llamados application.exe dentro de las subcarpetas:

 ls application.exe -r | % versioninfo 
  • -r es un alias para -Recurse

Puede refinar esto agregando -ea silentlycontinue ignorando cosas como errores de permisos en carpetas que no puede buscar:

 ls application.exe -r -ea silentlycontinue | % versioninfo 
  • -ea es un alias para -ErrorAction

Finalmente, si obtiene puntos suspensivos (…) en sus resultados, puede anexar | fl | fl para devolver la información en un formato diferente. Esto arroja muchos más detalles, aunque formateados en una lista, más que en una línea por resultado:

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

Me doy cuenta de que esto es muy similar a la respuesta de xcud en que ls y dir son ambos alias para Get-ChildItem . Pero espero que mi método “más corto” ayude a alguien.

El último ejemplo podría escribirse a mano dura de la siguiente manera:

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

… pero creo que mi camino es más fresco y, para algunos, más fácil de recordar. (Pero sobre todo más fresco).

Encuentro esto útil:

 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 } 

Como dijo EBGreen, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (ruta) funcionará, pero recuerde que también puede obtener todos los miembros de FileVersionInfo, por ejemplo:

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

Debería poder usar todos los miembros de FileVersionInfo documentados aquí, lo que básicamente le proporcionará todo lo que pueda desear sobre el archivo.

Aquí un método alternativo. Utiliza Get-WmiObject CIM_DATAFILE para seleccionar la versión.

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