file - subcarpetas - renombrar varios archivos powershell




Obtener la versión del archivo en PowerShell (7)

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


'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

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

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
}

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.


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




versioninfo