read - python search text in pdf
Python Windows File Version attribute (7)
Puede usar la herramienta filever.exe para hacer eso. Aquí hay un hilo que explica cómo hacerlo desde Python . Y aquí está el artículo de KB con detalles sobre la herramienta.
La última vez hice una pregunta similar, pero eso era sobre la información de versiones relacionadas con svn. Ahora me pregunto cómo consultar el atributo "Versión de archivo" de Windows, por ejemplo. un dll. Presté atención también a los módulos wmi y win32file sin éxito.
Encontré esta solución en el sitio "timgolden". Funciona bien.
from win32api import GetFileVersionInfo, LOWORD, HIWORD
def get_version_number (filename):
info = GetFileVersionInfo (filename, "//")
ms = info[''FileVersionMS'']
ls = info[''FileVersionLS'']
return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls)
if __name__ == ''__main__'':
import os
filename = os.environ["COMSPEC"]
print ".".join ([str (i) for i in get_version_number (filename)])
Es mejor agregar una prueba / excepto en caso de que el archivo no tenga ningún atributo de número de versión.
filever.py
from win32api import GetFileVersionInfo, LOWORD, HIWORD
def get_version_number (filename):
try:
info = GetFileVersionInfo (filename, "//")
ms = info[''FileVersionMS'']
ls = info[''FileVersionLS'']
return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls)
except:
return 0,0,0,0
if __name__ == ''__main__'':
import os
filename = os.environ["COMSPEC"]
print ".".join ([str (i) for i in get_version_number (filename)])
yourscript.py:
import os,filever
myPath="C://path//to//check"
for root, dirs, files in os.walk(myPath):
for file in files:
file = file.lower() # Convert .EXE to .exe so next line works
if (file.count(''.exe'') or file.count(''.dll'')): # Check only exe or dll files
fullPathToFile=os.path.join(root,file)
major,minor,subminor,revision=filever.get_version_number(fullPathToFile)
print "Filename: %s /t Version: %s.%s.%s.%s" % (file,major,minor,subminor,revision)
¡Aclamaciones!
Puede usar el módulo pyWin32
de http://sourceforge.net/projects/pywin32/ :
from win32com.client import Dispatch
ver_parser = Dispatch(''Scripting.FileSystemObject'')
info = ver_parser.GetFileVersion(path)
if info == ''No Version Information Available'':
info = None
Aquí hay una función que lee todos los atributos de archivo como un diccionario:
import win32api
#==============================================================================
def getFileProperties(fname):
#==============================================================================
"""
Read all properties of the given file return them as a dictionary.
"""
propNames = (''Comments'', ''InternalName'', ''ProductName'',
''CompanyName'', ''LegalCopyright'', ''ProductVersion'',
''FileDescription'', ''LegalTrademarks'', ''PrivateBuild'',
''FileVersion'', ''OriginalFilename'', ''SpecialBuild'')
props = {''FixedFileInfo'': None, ''StringFileInfo'': None, ''FileVersion'': None}
try:
# backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc
fixedInfo = win32api.GetFileVersionInfo(fname, ''//')
props[''FixedFileInfo''] = fixedInfo
props[''FileVersion''] = "%d.%d.%d.%d" % (fixedInfo[''FileVersionMS''] / 65536,
fixedInfo[''FileVersionMS''] % 65536, fixedInfo[''FileVersionLS''] / 65536,
fixedInfo[''FileVersionLS''] % 65536)
# /VarFileInfo/Translation returns list of available (language, codepage)
# pairs that can be used to retreive string info. We are using only the first pair.
lang, codepage = win32api.GetFileVersionInfo(fname, ''//VarFileInfo//Translation'')[0]
# any other must be of the form /StringfileInfo/%04X%04X/parm_name, middle
# two are language/codepage pair returned from above
strInfo = {}
for propName in propNames:
strInfoPath = u''//StringFileInfo//%04X%04X//%s'' % (lang, codepage, propName)
## print str_info
strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath)
props[''StringFileInfo''] = strInfo
except:
pass
return props
Aquí hay una versión que también funciona en entornos que no son de Windows, utilizando el módulo pefile :
import pefile
def LOWORD(dword):
return dword & 0x0000ffff
def HIWORD(dword):
return dword >> 16
def get_product_version(path):
pe = pefile.PE(path)
#print PE.dump_info()
ms = pe.VS_FIXEDFILEINFO.ProductVersionMS
ls = pe.VS_FIXEDFILEINFO.ProductVersionLS
return (HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls))
if __name__ == "__main__":
import sys
try:
print "%d.%d.%d.%d" % get_product_version(sys.argv[1])
except:
print "Version info not available. Maybe the file is not a Windows executable"
Aquí hay una versión que no requiere ninguna biblioteca adicional. No pude usar win32api como todos habían sugerido:
De: https://mail.python.org/pipermail//python-list/2006-November/402797.html
Solo se copia aquí en caso de que el original desaparezca.
import array
from ctypes import *
def get_file_info(filename, info):
"""
Extract information from a file.
"""
# Get size needed for buffer (0 if no info)
size = windll.version.GetFileVersionInfoSizeA(filename, None)
# If no info in file -> empty string
if not size:
return ''''
# Create buffer
res = create_string_buffer(size)
# Load file informations into buffer res
windll.version.GetFileVersionInfoA(filename, None, size, res)
r = c_uint()
l = c_uint()
# Look for codepages
windll.version.VerQueryValueA(res, ''//VarFileInfo//Translation'',
byref(r), byref(l))
# If no codepage -> empty string
if not l.value:
return ''''
# Take the first codepage (what else ?)
codepages = array.array(''H'', string_at(r.value, l.value))
codepage = tuple(codepages[:2].tolist())
# Extract information
windll.version.VerQueryValueA(res, (''//StringFileInfo//%04x%04x//'
+ info) % codepage,
byref(r), byref(l))
return string_at(r.value, l.value)
Usado así:
print get_file_info(r''C:/WINDOWS/system32/calc.exe'', ''FileVersion'')