Pregunta

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

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

¿Fue útil?

Solución

Desde PowerShell puede llamar .NET las clases, se podría hacer lo siguiente:

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

O como señalar 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 una secuencia de comandos: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.la entrada

Otros consejos

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

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

Curiosamente, se puede obtener la actualización (parcheado) ProductVersion mediante el uso de este:

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

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

Sin embargo, aunque es correcto en el Mensaje, es posible que la ProductVersion y FileVersion a ser diferente (es común, de hecho).Así que la única manera de obtener el actualizado Fileversion es construir por sí mismo, algo como esto:

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

O más bien, como este:

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 usted tendrá un FileVersion propiedad que muestra la actualización de la FileVersion ...

'dir' es un alias para Get-ChildItem que va a volver de un Sistema.IO.Clase FileInfo cuando usted está llamando desde el sistema de archivos que tiene VersionInfo como una propiedad.Así que ...

Para obtener la información de la versión de un solo archivo de hacer 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 de este:

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

Yo prefiero instalar el PowerShell Extensiones De La Comunidad De y sólo tiene que utilizar el FileVersionInfo función que proporciona.

Así:

Get-FileVersionInfo MyAssembly.dll

con una salida como:

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

Lo he utilizado en contra de un directorio completo de las asambleas con gran éxito.

Otra manera de hacerlo es utilizar el construido-en el archivo de la técnica de acceso:

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

También puede obtener alguna propiedad en particular fuera de la VersionInfo, así:

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

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

Me doy cuenta de que esto ya ha sido respondido, pero si alguien está interesado en escribir unos pocos caracteres, creo que este es el camino más corto 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 manera abreviada de escribir {$_.VersionInfo}

La ventaja de usar ls de esta manera es que puede adaptarse fácilmente a ella para buscar un archivo dentro de las subcarpetas.Por ejemplo, el siguiente comando devolverá la información de versión de todos los archivos llamados application.exe dentro de las subcarpetas:

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

Usted puede refinar esto mediante la adición de -ea silentlycontinue a ignorar cosas como el permiso de errores en las carpetas no se puede buscar:

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

Por último, si usted está recibiendo puntos suspensivos (...) en sus resultados, puede anexar | fl para devolver la información en un formato diferente.Este devuelve mucho más detalle, aunque el formato de una lista, más que en una línea por cada resultado:

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

Comprendo que esto es muy similar a la xcud la respuesta en la que ls y dir son los dos alias para Get-ChildItem.Pero estoy esperando a que mi "menor" método de ayuda a alguien.

El último ejemplo podría ser escrito en la larga mano 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áciles de recordar.(Pero sobre todo más fresco).

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

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

Esto me parece ú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 EBGreen dijo, [Sistema.Los diagnósticos.FileVersionInfo]::GetVersionInfo(ruta de acceso) funcionará, pero recuerde que usted también puede obtener todos los miembros de FileVersionInfo, por ejemplo:

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

Usted debe ser capaz de utilizar todos los miembros de FileVersionInfo documentado aquí, que se obtiene, básicamente, cualquier cosa que usted podría desear sobre el archivo.

Aquí un método alternativo.Se 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top