Использование "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.