Получите версию файла в PowerShell

import simplejson

class User(object):
    def __init__(self, name, mail):
        self.name = name
        self.mail = mail

    def _asdict(self):
        return self.__dict__

print(simplejson.dumps(User('alice', 'alice@mail.com')))

, если используется стандарт json, необходимо определить функцию default

import json
def default(o):
    return o._asdict()

print(json.dumps(User('alice', 'alice@mail.com'), default=default))
137
задан Peter Mortensen 1 December 2014 в 00:21
поделиться

6 ответов

Так как PowerShell может назвать классы.NET, Вы могли сделать следующее:

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

Или, как отмечено здесь в списке файлов:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

Или еще более хороший как сценарий: http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

128
ответ дан 23 November 2019 в 23:31
поделиться

В наше время можно получить FileVersionInfo от Получать-объекта или Добраться-ChildItem, но он покажет исходный FileVersion от поставленного продукта а не обновленную версию. Например:

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

Интересно, можно получить обновленный (исправленный) ProductVersion при помощи этого:

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

Различие, которое я делаю между "исходным" и "исправленным", происходит в основном из-за способа, которым вычисляется FileVersion (см. документы здесь). В основном начиная с Vista, Windows API GetFileVersionInfo запрашивает часть информации о версии с языка нейтральный файл (exe/dll) и нефиксированная часть из определенного для языка mui файла (который не обновляется каждый раз изменение файлов).

Таким образом с файлом как lsasrv (который был заменен из-за проблем безопасности в SSL/TLS/RDS в ноябре 2014) версии, о которых сообщают эти две команды (по крайней мере некоторое время после той даты), отличались, и второй является более "корректной" версией.

Однако, хотя это корректно в LSASrv, для ProductVersion и FileVersion возможно отличаться (это распространено, на самом деле). Таким образом, единственный способ получить обновленный Fileversion прямо из файла блока состоит в том, чтобы создать его самостоятельно от частей, чего-то вроде этого:

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

Или путем получения по запросу данных из этого:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)

Можно легко добавить это ко всем объектам FileInfo путем обновления TypeData в PowerShell:

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

Теперь каждый раз Вы делаете Get-ChildItem или Get-Item у Вас будет a FileVersion свойство, которое показывает обновленный FileVersion...

161
ответ дан 23 November 2019 в 23:31
поделиться

Я предпочитаю устанавливать Расширения Сообщества PowerShell и просто использовать Получить-FileVersionInfo функцию, которую это обеспечивает.

Как так:

Get-FileVersionInfo MyAssembly.dll

с выводом как:

ProductVersion   FileVersion      FileName
--------------   -----------      --------
1.0.2907.18095   1.0.2907.18095   C:\Path\To\MyAssembly.dll

я использовал его против всего каталога блоков с большим успехом.

16
ответ дан 23 November 2019 в 23:31
поделиться
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
4
ответ дан 23 November 2019 в 23:31
поделиться

Как сказанный EBGreen, [Система. Диагностика. FileVersionInfo]:: GetVersionInfo (путь) будет работать, но помнить, что можно также получить всех членов FileVersionInfo, например:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

необходимо смочь использовать каждого члена FileVersionInfo, зарегистрированного здесь, который получит Вас в основном что-либо, что Вы могли когда-либо хотеть о файле.

2
ответ дан 23 November 2019 в 23:31
поделиться

«Dir» - это псевдоним для Get-ChildItem, который вернется обратно класс System.io.fileinfo, когда вы называете его из файловой системы, которая имеет версию в качестве свойства. Итак ...

Чтобы получить информацию о версии одного файла сделать это:

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     :

для нескольких файлов это:

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
47
ответ дан 23 November 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: