Windows: VersionsInformationen aus EXE und DLL Files lesen

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Extrahiert die Versions Informationen aus ausführbaren Windows-Programmen.

Code: Alles auswählen

def getFileVerInfo( FileName, DescItems ):
    """
    Liefert VersionsInformationen die in EXE- und DLL-Dateien, sofern vorhanden, zurück
    DescItems ist eine Liste mit Eintragsnamen.
    Bsp:
    DescItems = ["CompanyName", "FileDescription", "FileVersion", "InternalName"]
    """
    def getInfo( InfoStr, RAWdata ):
        Info = re.findall( InfoStr+"(.+?)\x01", RAWdata )
        if Info == []:
            return None
        else:
            return Info[0][:-2]

    FileHandle = open( FileName, "rb" )
    RAWdata = FileHandle.read().replace("\x00","")
    FileHandle.close()

    POS = RAWdata.rfind( "StringFileInfo" )

    if POS == -1:
        # Wenn "StringFileInfo" nicht gefunden wird, sind
        # auch keine Datei-Informationen vorhanden
        return

    EndPOS = RAWdata.rfind( "VarFileInfo" )
    if EndPOS == -1:
        # "VarFileInfo" kommt nicht in allen Dateien vor, also
        # werden einfach eine Hand voll Zeichensalat untersucht
        EndPOS = POS+500

    RAWdata = RAWdata[ POS:EndPOS ]

    FileInfo = {}
    for Item in DescItems:
        FileInfo[Item] = getInfo( Item, RAWdata )

    return FileInfo
Beispielanwendung
Es werden alle *.exe und *.dll Dateien auf C:\ mit den VersionsInformationen aufgelistet.

Code: Alles auswählen

Endungen = [".exe",".dll"]
DescItems = ["CompanyName", "FileDescription", "FileVersion", "InternalName"]

for Verz, VerzList, DateiListe in os.walk("C:\\"):
    for Datei in DateiListe:
        FileExt = os.path.splitext(Datei)[1]
        if FileExt in Endungen:
            Datei = Verz+os.sep+Datei
            print "\n>",Datei

            FileInfo = getFileVerInfo( Datei, DescItems )

            if FileInfo:
                for i in FileInfo:
                    print i,"-", FileInfo[i]
            else:
                print "- Keine DateiInformation vorhanden -"
Beispiel-Ausgabe (nur eine Datei):

Code: Alles auswählen

> C:\Programme\Gemeinsame Dateien\InstallShield\Driver\7\Intel 32\IScript7.dll
InternalName - Engine
FileDescription - InstallShield (R) Script Engine
FileVersion - 7,07, 0, 262
CompanyName - InstallShield Software Corporation
"Entwicklungsgeschichte" hier: http://python.sandtner.org/viewtopic.php?t=2287

EDIT: Anmerkung, es gibt auch win32api.GetFileVersionInfo ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:"Entwicklungsgeschichte" hier: http://python.sandtner.org/viewtopic.php?t=2287
Der neue Link lautet: http://www.python-forum.de/viewtopic.php?t=2287
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten