Frage zu 7-Zip



  • Hallo,

    ich rufe das Programm 7-Zip über die 7z.exe von meinem Programm aus auf. Hierzu übergebe ich verschiedene Parameter, über welche ich packen und entpacken kann. Die 7z.exe liefert mir Exit Codes zurück, wenn was nicht funktioniert hat. Leider sind diese Exit Codes nicht besonders aussagenkräftig.

    Hier mal die Exit Codes:

    0 No error
    1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
    2 Fatal error
    7 Command line error
    8 Not enough memory for operation
    255 User stopped the process

    In der Konsole gibt er genauere Details über das Problem aus, z.B. "Archive not found" oder "Invalid passwort".

    Kennt ihr eine Möglichkeit, wie ich an die Informationen komme?

    Soweit ich weiß kann man dies, wenn man die Konsole ausliest bzw. die Ausgabe der Konsole abfängt. Aber gibt es hier vll. eine einfachere Lösung?

    Oder kann ich irgendwie die Nachrichten direkt von der 7z.exe abfangen?

    Gruß
    Flo


  • Mod

    Ohne Redirect der Consolen Ausgabe bekommst Du das nicht hin...
    Siehe:
    Creating a Child Process with Redirected Input and Output (Windows)
    http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx

    BTW: Du kannst doch auch die 7zip Library benutzen...



  • Danke habs so hinbekommen 👍

    Ich hätte aber noch eine Frage. Ich rufe die 7z.exe über CreateProcess auf und übergebe eine Command Line. Wenn ich die 7z.exe manuelle über cmd.exe aufrufe und an die Parameter >"C:\test.txt" anhänge, wird die Ausgabe der Konsole in die Textdatei test.txt umgeleitet.

    Hänge ich aber den Befehl >"C:\test.txt" an meine Command Line an, zeigt es mir in der Konsole den gleichen Programmaufruf mit Parameterübergae an, aber die Sachen die danach kommen werden nicht in die Textdatei umgeleitet, sondern ganz normal in der Konsole ausgegeben.

    Woran kann dies liegen?


  • Mod

    > ist das Pipezeichen für CMD.EXE oder Deinen Befehlszeileninterrepter.
    Die Windows API selbst weiß davon nichts und kennst so etwas nicht...

    Du kannst das Pipe-Zeichen also nur in Verbindung mit CMD.EXE oder 4NT.EXE oder sonst was benutzen.

    CMD /C meinbefehl.exe > meineausgabe.exe
    

    würdenatürlich gehen...



  • Danke für die schnelle Antwort.

    Ich übergebe jetzt folgende Command Line an Create Process:

    CMD /c "C:\7z.exe" x "C:\test.7z" -o"C:\unpack\" -y >"C:\log.txt"
    

    Nur jetzt meckert er rum, dass er den Befehl C:\test.7z nicht kennt. Bin leider nicht so fit in Konsolenbefehle.



  • Hat sich erledigt, ich darf das C:\7z.exe nicht in " " schreiben, nun funktionierts.



  • Habe nun doch wieder ein Problem: Sobald ich weitere Befehle (z.B. -pPasswort oder -y) an die Command Line anhänge, liefert mir 7zip immer einen Non fatal error (error code 1) zurück.


  • Mod

    Vielleicht ein Bug in 7z?



  • Habe es nun doch hinbekommen: Man muss den kompletten Befehl hinter CMD /c in Anführungszeichen setzen, also so:

    CMD /c "C:\7z.exe x C:\test.7z -oC:\unpack\ -y >C:\log.txt"
    

    Gruß
    Flo



  • @1c3m4n:
    Du kannst übrigens auch innterhalb der äusseren "" weitere innere "" verwenden - z.B. für Pfade die Leerzeichen enthalten.
    Lies dir mal die Hilfe zu cmd.exe durch, da steht das beschreiben (einfach mal cmd /? ausfürhen).

    Beispiel:

    cmd.exe /S ""path/to my/program.exe" "param 1/file.txt" "param 2/file.txt" -s1 -s2 -s3"
    ->
    "path/to my/program.exe" "param 1/file.txt" "param 2/file.txt" -s1 -s2 -s3
    

Anmelden zum Antworten