Windows: Versionsinformationen von EXE-Dateien einlesen???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 09:55

Also bei allen Experimenten, scheit mir die Lösung hier:
http://python.sandtner.org/viewtopic.php?p=12502#12502
noch am besten zu sein ;)

Naja, ich hab sie mal mit neuen Erkenntnissen ausgestattet:

Code: Alles auswählen

def gefFileInfo( FileName ):
    def getInfo( InfoStr ):
        return re.findall( InfoStr+"(.+)\x01", RAWdata )[0][:-2]

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

    POS = RAWdata.rfind( "StringFileInfo" )

    if POS == -1:
        print "* NOT FOUND *"
        return

    EndPOS = RAWdata.rfind( "VarFileInfo" )
    if EndPOS == -1:
        EndPOS = POS+500

    RAWdata = RAWdata[ POS:EndPOS]

    print getInfo( "CompanyName" )
    print getInfo( "FileDescription" )
    print getInfo( "FileVersion" )
    print getInfo( "InternalName" )


Leider versagt aber bei re.findall( InfoStr+"(.+)\x01", RAWdata ) die "suche" nach \x01

@dookie: Du hattes irgdnwo mal \0x01 geschrieben... Warum?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. November 2004, 11:38

@dookie: Du hattes irgdnwo mal \0x01 geschrieben... Warum?
War wohl ein Tippfehler :)


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 17:46

Und ich dachte schon, es wäre eine andere Schreibform oder so...

Aber wie erklärt es sich, das re.findall( InfoStr+"(.+)\x01", RAWdata ) nicht bei \x01 "aufhöhrt" ???
Das Ergebnis ist immer ab dem InfoStr bis zum ende... Obwohl da halt ein \x01 kommt...

Kommt RE mit Sonderzeichen nicht zurecht?

EDIT: Anscheinend, denn das hier funktioniert:

Code: Alles auswählen

        RAWdata = RAWdata.replace("\x01","\n")
        return re.findall( InfoStr+"(.+)\n", RAWdata )[0][:-2]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Mittwoch 24. November 2004, 17:53

Hi. Vielleicht ist ja das letzte zZeichen ein \x01, denn du hast ja im greedy mode gesucht :wink:
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. November 2004, 17:56

versuchs mal so
re.findall( InfoStr+"([^\x01]+)", RAWdata )

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 17:58

Jep, das geht... Wieso?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Mittwoch 24. November 2004, 18:29

Hi. Auch \x01 ist ein beliebiges Zeichen und wird durch den Punkt "." repräsentiert und soll beliebig oft vorkommen. Aus der Docu:
*?, +?, ??
The "*", "+", and "?" qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn't desired; if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. Adding "?" after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.

Außerdem ist ein Punkt kein "\n". Das heißt, er sucht bei dir maximal eine Zeile raus, mehr nicht.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 18:48

Das macht es jetzt ein wenige klarer... Somit macht es eigentlich immer Sinn ein "?" zu benutzen...

Nun gut, re.findall( InfoStr+"(.+?)\x01", RAWdata ) klappt nun auch, es ist sogar besser als die "([^\x01]+)" Variante...
Denn ich hab festgestellt, das in seltenen Fällen es leider doch kein \x01 gibt:
z.b.: für folgende Windows-Dateien:
C:\windows\twain.dll - (Twain-Source-Manager)
C:\windows\AppPatch\AcLayers.dll - (Windows Compatibility DLL)

mit der Such mittels "(.+?)\x01" fällt twain.dll schon mal raus... Bei der anderen Datei kommen allerdings fehlerhafte Ergebnisse zurück :(
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Mittwoch 24. November 2004, 19:37

Hi. Das würde ich nicht so sehen, denn wie gesagt, sobald ein "\n" vorkommt, versagt deine Variante, wenn du nicht im DOT-ALL modus bist (Da ist der "." auch ein "\n"). Mach lieber das:

Code: Alles auswählen

muster=re.compile(InfoStr+"([^\x01]+)\x01")
#oder bei dir (trotzdem net so gut, non-greedy):
#muster=re.compile(InfoStr+"(.+?)\x01",re.DOTALL)
muster.findall( RAWdata )
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 19:57

Milan hat geschrieben:sobald ein "\n" vorkommt, versagt deine Variante


Da hast du eigentlich recht... Allerdings zeigt sich jedoch, das "(.+?)\x01" besser klappt... Zumindest habe ich bisher nichts gegenteilige feststellen können...

Doch ich würde es ehr vorziehen A-Za-z0-9 usw. zu nehmen, also wirklich nur Zeichen die vorkommen dürfen, allerdings funktioniert es leider nicht... Es kommen nie Treffer zu stande bei:
re.findall( InfoStr+"([a-zA-Z0-9_]+)\x01", RAWdata )
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. November 2004, 20:06

noch nen versuch:
re.findall(InfoStr+"([a-zA-Z0-9_\x00]+)\x01", RAWdata)
oder
re.findall(InfoStr+"([\w\x00]+)\x01", RAWdata)
eventuell, falls auch Leerzeichen und Linefeeds vorkommen
re.findall(InfoStr+"([\w\x00\x20\r\n]+)\x01", RAWdata)


Gruß

Dookie

PS.: jetzt weiss ich woher das \0x01 kam, mit 0x01 wird in Python eine Hexadezimalzahl direkt im Code geschrieben. :)

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 24. November 2004, 20:10

Alle drei Varianten funktionieren leider nicht... es wird nie etwas gefunden...

Hab das Listing, mit Beispielanwendung mal hier gepostet:
http://python.sandtner.org/viewtopic.php?p=12561

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], snafu