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 File Version, aunque otra información de versión (que es, Company, Language, Product Name, etc.) también sería útil.

Author: Peter Mortensen, 2008-08-27

11 answers

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

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

O como señaló 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 un guión: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D! 125.entry

 107
Author: Lars Truijens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-01 00:22:37

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

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

Curiosamente, puedes obtener la versión de producto actualizada (parcheada) usando esto:

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

Tenga en cuenta que con un archivo como lsasrv (que fue reemplazado debido a problemas de seguridad en SSL/TLS/RDS en noviembre de 2014) las versiones reportadas por estos dos comandos son diferentes, y el el segundo es la versión correcta.

Sin embargo, aunque es correcto en LSASrv, es posible que la ProductVersion y FileVersion sean diferentes (es común, de hecho). Así que la única manera de obtener el actualizado Fileversion es construirlo usted mismo, algo como esto:

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

O mejor dicho, 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 lo hagas Get-ChildItem o Get-Item tendrás una propiedad FileVersion que muestra la FileVersion actualizada ...

 137
Author: Jaykul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 07:49:50

'dir' es un alias para Get-ChildItem que devolverá una clase System.IO.FileInfo cuando la esté llamando desde el sistema de archivos que tiene VersionInfo como propiedad. Tan ...

Para obtener la información de la 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
 40
Author: xcud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-29 04:00:08

Prefiero instalar PowerShell Community Extensions y simplemente usar la función Get-FileVersionInfo que proporciona.

Así:

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 todo un directorio de ensamblajes con gran éxito.

 15
Author: David Mohundro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-05 12:54:31

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

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

También puede obtener cualquier propiedad particular del VersionInfo, así:

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

Esto está bastante cerca de la técnica dir.

 11
Author: Wes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-01 00:27:21

Esto es basado en las otras respuestas, pero es exactamente lo que buscaba:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
 7
Author: noelicus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-28 11:31:45

Me doy cuenta de que esto ya ha sido contestado, 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
  • {[5] } es un alias para Get-ChildItem
  • {[7] } es un alias para ForEach-Object
  • versioninfo aquí hay una forma abreviada de escribir {$_.VersionInfo}

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

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

Puede refinar aún más esto agregando -ea silentlycontinue para ignorar 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 usted está recibiendo elipses (...) en sus resultados, puede agregar | fl para devolver la información en un formato diferente. Esto devuelve mucho más detalle, aunque formateado en una lista, más bien 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 ejemplo final podría escribirse a mano larga de la siguiente manera:{[25]]}

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 refrigerador).

 5
Author: oliver-clare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 11:23:03
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
 4
Author: EBGreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 17:41:59

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
}
 3
Author: Chriseyre2000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-01 00:27:45

Como dijo EBGreen, [Sistema.Diagnostico.FileVersionInfo]:: GetVersionInfo (path) 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 le proporcionará básicamente todo lo que pueda desear sobre el archivo.

 2
Author: Adam Haile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 17:46:00

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
 1
Author: Knuckle-Dragger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 17:30:33