2008-08-27 29 views
97

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

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

Respuesta

93

Desde PowerShell puede llamar .NET clases, se puede hacer lo siguiente:

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

O como noted here 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 script: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

+8

Consulte @Jaykul para obtener una solución que no requiera un objeto .NET. La respuesta de IMHO Jaykul debería haber sido seleccionada como la respuesta :) –

+1

Aunque las otras respuestas dan comandos más cortos, todos los que intenté imprimir demasiada información y truncar la ruta del archivo a "...". El segundo comando en esta respuesta proporciona exactamente lo que necesita, funciona para un directorio de archivos y está formateando de manera que es fácil ver cómo modificarlo para devolver otra información. Simplemente cambie .LegalCopyright en el comando para .FileVersion. – Dennis

+2

Por cierto, el enlace "anotado aquí" está muerto. –

4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll") 
2

Como EBGreen dijo, [System.Diagnostics.FileVe rsionInfo] :: GetVersionInfo (ruta) funcionará, pero recuerda que también se 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 conseguirá Básicamente, cualquier cosa que pueda desear sobre el archivo.

14

Prefiero instalar PowerShell Community Extensions y solo uso la función Get-FileVersionInfo 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.

+0

Me gusta esa respuesta. :-) –

125

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

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

Curiosamente, se puede obtener la actualización (parche) ProductVersion utilizando esta:

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

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

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

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

O, más bien, como esta:

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 haga Get-ChildItem o Get-Item tendrá una propiedad FileVersion que muestra la FileVersion actualizada ...

+10

Y para que esto sea equivalente a la respuesta aceptada de Lars, simplemente use '(Get-Command C: \ Path \ YourFile.Dll) .FileVersionInfo.FileVersion' – rand0m1

+0

Me intriga el 'Get-Command' aplicado a un archivo dll. ¿Podrías dar más detalles sobre su efecto? –

+0

Bueno, en los viejos tiempos, FileInfo no tenía una propiedad ScriptProperty "VersionInfo" como ahora, pero el objeto ApplicationInfo devuelto por Get-Command incluía una propiedad de script "FileVersionInfo" (que es la misma que la versiónInfo que está en el FileInfo objetos en las versiones más nuevas de PowerShell). – Jaykul

35

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

para obtener la información de 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 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 
+0

Útil en eso incluye también otros metadatos comunes (como el nombre y la descripción de la empresa). –

10

Sólo otra manera de hacerlo es utilizar el incorporado -en técnica de acceso de archivos:

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

también puede conseguir cualquier propiedad particular de la VersionInfo, por lo tanto:

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

Esto es bastante parecido a la técnica dir.

+0

funcionó como un encanto para mí! – shaiss

+0

(get-item \\ "$ computerName" \ "C $ \ Archivos de programa \ Symantec AntiVirus \ VPDN_LU.exe"). VersionInfo.FileVersion funcionó para mí. Necesitaba agregar un nombre de computadora de un bucle. – Tequila

2

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 
} 
+0

¿Es esto un VBScript? – macetw

+1

No es powershell – Chriseyre2000

7

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

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion 
+0

Me intriga el 'Get-Command' aplicado a un archivo dll. ¿Podrían explicar su efecto (antes incluso de llamar a la propiedad FileVersionInfo)? –

+0

Los archivos dll contienen 'FileVersionInfo' tal como lo hacen los archivos exe. Aplicando este comando a la ruta obtendrás la información de la versión del archivo. – noelicus

0

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 
+0

usando una ruta compartida con espacios en el nombre, obtuve "La propiedad 'Versión' no se puede encontrar en este objeto. Verifique que la propiedad exista." – AnneTheAgile

Cuestiones relacionadas