file - por - renombrar archivos en subcarpetas
Obtener la versiĆ³n del archivo en PowerShell (10)
''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
¿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.).
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
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.
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
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
}
Esto se basa en las otras respuestas, pero es exactamente lo que estaba buscando:
(Get-Command C:/Path/YourFile.Dll).FileVersionInfo.FileVersion
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 ...
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.
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.
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path/To/File.dll")