Использование "pefile.py" для получения версии файла (.exe)

Я хочу использовать Python, чтобы получить версию исполняемого файла, и я знаю о pefile.py

как использовать это, чтобы сделать это?

примечания: исполняемый файл может быть неполным.

3 ответа

Вот полный пример скрипта, который делает то, что вы хотите:

import sys

def main(pename):
    from pefile import PE
    pe = PE(pename)
    if not 'VS_FIXEDFILEINFO' in pe.__dict__:
        print "ERROR: Oops, %s has no version info. Can't continue." % (pename)
        return
    if not pe.VS_FIXEDFILEINFO:
        print "ERROR: VS_FIXEDFILEINFO field not set for %s. Can't continue." % (pename)
        return
    verinfo = pe.VS_FIXEDFILEINFO
    filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF)
    prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF)
    print "Product version: %d.%d.%d.%d" % prodver
    print "File version: %d.%d.%d.%d" % filever

if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.stderr.write("ERROR:\n\tSyntax: verinfo <pefile>\n")
        sys.exit(1)
    sys.exit(main(sys.argv[1]))

Соответствующие строки:

    verinfo = pe.VS_FIXEDFILEINFO
    filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF)
    prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF)

все это происходит только после проверки, что у нас есть что-то значимое в этих свойствах.

Предполагая, что под "версией исполняемого файла" вы подразумеваете a) в Windows, b) информацию, отображаемую на вкладке "Свойства", в разделе "Версия файла", вы можете получить ее с помощью пакета pywin32 с помощью команды, подобной следующей:

>>> import win32api as w
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionMS'])
'0x60000'
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionLS'])
'0x17714650'

Обратите внимание, что 0x60000 имеет старшие / второстепенные числа (6.0), а 0x17714650 - следующие два, которые, если их принять за два отдельных слова (0x1771 и 0x4650 или 6001 и 18000 в десятичном формате), соответствуют значениям на моем компьютере, где версия regedit имеет вид 6.0.6001.18000.

Номера версий программ Windows хранятся в разделе ресурсов файла программы, а не в заголовке формата PE. Я не знаком с pefile.py, поэтому я не знаю, обрабатывает ли он непосредственно разделы ресурса. Если нет, то вы сможете найти информацию, необходимую для этого в этой статье MSDN.

Другие вопросы по тегам