¿Cómo puede obtener la información de la versión de un archivo .dll
o .exe
en PowerShell?
Estoy interesado específicamente en File Version
, aunque otra información de la versión (es decir, Company
, Language
, Product Name
, etc.) sería útil también.
file
powershell
versioninfo
Emperador XLII
fuente
fuente
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
y compare FilePrivatePart con la última parte de FileVersion. FileVersion muestra lo que se envió originalmente, y no la versión parcheada. Este comando, por otro lado, muestra el número de versión parcheado: (get-command C: \ Windows \ System32 \ ubpm.dll)(Get-Command ... ).Version
devuelve ProductVersion, no FileVersion , y a veces eso es importante. Entonces, para obtener una solución completa que realmente devuelva la FileVersion actualizada , consulte el ejemplo Update-TypeData en mi respuesta a continuación.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:
Curiosamente, se puede obtener la actualización (parche) ProductVersion utilizando la siguiente:
La distinción que estoy haciendo entre "original" y "parcheado" se debe básicamente a la forma en que se calcula la FileVersion ( ver los documentos aquí ). Básicamente desde Vista, la API de Windows GetFileVersionInfo está consultando parte de la información de la versión del archivo de idioma neutral (exe / dll) y la parte no fija de un archivo mui específico del idioma (que no se actualiza cada vez que cambian los archivos )
Entonces, con un archivo como lsasrv (que fue reemplazado debido a problemas de seguridad en SSL / TLS / RDS en noviembre de 2014), las versiones informadas por estos dos comandos (al menos durante un tiempo después de esa fecha) fueron diferentes, y el segundo es el versión más "correcta".
Sin embargo, aunque es correcto en LSASrv, es posible que ProductVersion y FileVersion sean diferentes (de hecho, es común). Entonces, la única forma de obtener la Fileversion actualizada directamente desde el archivo de ensamblaje es construirla usted mismo a partir de las partes, algo como esto:
O extrayendo los datos de esto:
Puede agregar esto fácilmente a todos los objetos FileInfo actualizando TypeData en PowerShell:
Ahora, cada vez que lo haga
Get-ChildItem
oGet-Item
tendrá unaFileVersion
propiedad que muestra la FileVersion actualizada ...fuente
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
aplicado a un archivo dll. ¿Podrías dar más detalles sobre su efecto?(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
una forma más nueva y sencilla de obtener la misma información de ProductVersion que se documenta en la respuesta? Realmente no confío en que Microsoft use el término de maneraProductVersion
consistente.'dir' es un alias para Get-ChildItem que devolverá una clase System.IO.FileInfo cuando lo llame desde el sistema de archivos que tiene VersionInfo como propiedad. Entonces ...
Para obtener la información de la versión de un solo archivo, haga esto:
Para múltiples archivos esto:
fuente
Prefiero instalar PowerShell Community Extensions y simplemente usar la función Get-FileVersionInfo que proporciona.
Al igual que:
con salida como:
Lo he usado contra todo un directorio de ensamblajes con gran éxito.
fuente
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
es un alias paraGet-ChildItem
%
es un alias paraForEach-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 determinado dentro de las subcarpetas. Por ejemplo, el siguiente comando devolverá información de la versión para todos los archivos llamadosapplication.exe
dentro de las subcarpetas:-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:-ea
es un alias para-ErrorAction
Finalmente, si obtiene puntos suspensivos (...) en sus resultados, puede adjuntar
| fl
para devolver la información en un formato diferente. Esto devuelve muchos más detalles, aunque formateados en una lista, en lugar de en una línea por resultado:fl
es un alias paraFormat-List
Me doy cuenta de que esto es muy similar a la respuesta de xcud en eso
ls
ydir
son alias para ambosGet-ChildItem
. Pero espero que mi método "más corto" ayude a alguien.El último ejemplo podría escribirse a mano de la siguiente manera:
... pero creo que mi camino es más fresco y, para algunos, más fácil de recordar. (Pero sobre todo más fresco).
fuente
Otra forma de hacerlo es usar la técnica de acceso a archivos incorporada:
También puede obtener cualquier propiedad particular de VersionInfo, por lo tanto:
Esto está bastante cerca de la técnica dir.
fuente
Esto se basa en las otras respuestas, pero es exactamente lo que estaba buscando:
fuente
Get-Command
aplicado a un archivo dll. ¿Podría dar más detalles sobre su efecto (incluso antes de llamar a la propiedad FileVersionInfo)?FileVersionInfo
mismo que los archivos exe. ¡Aplicando este comando a la ruta obtendrá la información de la versión del archivo!fuente
Esto me parece útil:
fuente
Como dijo EBGreen, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (ruta) funcionará, pero recuerde que también puede obtener todos los miembros de FileVersionInfo, por ejemplo:
Debería poder utilizar a todos los miembros de FileVersionInfo documentados aquí, que le proporcionarán básicamente todo lo que pueda desear sobre el archivo.
fuente
Aquí un método alternativo. Utiliza Get-WmiObject CIM_DATAFILE para seleccionar la versión.
fuente