Oggi puoi ottenere FileVersionInfo da Get-Item o Get-ChildItem, ma mostrerà la FileVersion originale dal prodotto spedito e non la versione aggiornata. Per esempio:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
È interessante notare che puoi ottenere la ProductVersion aggiornata (patchata) usando questo:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
La distinzione che sto facendo tra "originale" e "corretto" è sostanzialmente dovuta al modo in cui viene calcolata la FileVersion ( vedere i documenti qui ). Fondamentalmente sin da Vista, l'API GetFileVersionInfo di Windows esegue una query su parte delle informazioni sulla versione dal file neutro della lingua (exe / dll) e la parte non fissa da un file mui specifico della lingua (che non viene aggiornato ogni volta che i file cambiano ).
Quindi con un file come lsasrv (che è stato sostituito a causa di problemi di sicurezza in SSL / TLS / RDS nel novembre 2014) le versioni riportate da questi due comandi (almeno per un po 'dopo quella data) erano diverse, e il secondo è il versione più "corretta".
Tuttavia, sebbene sia corretto in LSASrv, è possibile che ProductVersion e FileVersion siano diversi (è comune, in effetti). Quindi l'unico modo per ottenere la Fileversion aggiornata direttamente dal file di assieme è costruirla dalle parti, in questo modo:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
O estraendo i dati da questo:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Puoi facilmente aggiungerlo a tutti gli oggetti FileInfo aggiornando TypeData in PowerShell:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Ora ogni volta che lo fai Get-ChildItem
o Get-Item
avrai una FileVersion
proprietà che mostra la FileVersion aggiornata ...