Abfrage eines dynamischen wertes in einer Dos Box...

  • Hallo Autoit'ler

    Ich möchte gerne anhand eines Beispieles erfahren wie ein sich dynamischer Wert(also ein sich immer wieder verändernder Wert) aus einer @comspec (oder CMD.exe) auslesen lässt.

    Als Beispiel habe ich mal den lame encoder Vorgang genommen. In einer laufenden cmd box wird unter vielen informationen zum encoden auch ein Prozentwert ausgegeben. diesen möchte ich dann z.b. in eine Windows progressbar übergeben.

    Bin schon Öfters auf so ein Problem gestoßen, habe es dann jedoch umgangen indem andere Autoit Scriptfunktionen gefunden habe die das Consolenprogramm ersetzt haben. Sicherlich gibt es auch hier eine solche lösung, jedoch möchte ich Erfahren ob es auch so machbar ist. Gesehen hatte ich schon das es via DLL funktion im falle von Lame funktioniert, jedoch ist das im mom nicht die antwort auf meine Frage.

    Spoiler anzeigen
    [autoit]

    $output = _getDOSOutput(@ScriptDir & "\lame.exe input.wav output.mp3")

    [/autoit] [autoit][/autoit] [autoit]

    ; hier der code zum auslesen und erstellen des Prozessbars !?!

    [/autoit] [autoit][/autoit] [autoit]

    Func _getDOSOutput($command)
    Global $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2)
    While 1
    $text &= StdoutRead($Pid, False, False)
    If @error Then ExitLoop 2
    Sleep(10)
    Return $text
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_getDOSOutput

    [/autoit]

    oder kann man Stdoutread nicht dynamisch benutzen ?!?

    Gruß
    Pretrojaner

  • Zitat

    Du meinst, der Output wird nicht erweitert, sondern geändert?

    ich kenne das auch nur mit "pseudo"-Änderung = Erweiterung z.B. bei einer Fortschrittsanzeige....z.B bei CHKDSK.EXE

    Seltsam. Bei Ping funktioniert die "Fortschrittanzeige", bei CHKDSK bekomme ich garkeine Rückmeldung aus stdout

    [autoit]

    #include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $line = "", $oldline = ""

    [/autoit][autoit][/autoit][autoit]

    SplashTextOn("STDOUT", "Bitte warten......")
    $Console = Run(@ComSpec & " /c ping 199.198.197.196", @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    ;$Console = Run(@ComSpec & " /c chkdsk", @ScriptDir, @SW_hide,$STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line &= StdoutRead($Console)
    If @error Then ExitLoop
    If $line <> $oldline Then
    ControlSetText("STDOUT", "", "Static1", $line)
    $oldline = $line
    EndIf
    WEnd
    SplashOff()
    MsgBox(0, "STDOUT gesamt:", $line)

    [/autoit]
  • Zitat

    komisch ich bekomme mit deinem Code eine Anzeige von Chkdsk.

    8| , hmmmm, bei mir schließt sich das Fenster nach ca. einer Sekunde ;(
    Aber jedenfalls funktioniert das "Prinzip"^^
    Ach ich sehe gerade, du benutzt Vista, ich hatte das auf 2 Rechnern mit XP probiert....
    Mein CHKDSK hat aber auch nicht diese "fortlaufende " Info wie bei dir, sondern schreibt den Fortschritt immer in ein- und dieselbe Zeile.

    pretrojaner, probier das doch mal mit dem lame-encoder

  • Du meinst, der Output wird nicht erweitert, sondern geändert?

    ja genau das meine ich.

    bei anderen befehlen wie ping oder chkdsk, wird der output zeile für zeile untereinander geschrieben, bei programmen wie lame wird die zeile überschrieben. habe es mit den lösungen auch nicht hin bekommen.

    wenn ich mein Script so ausführe, sehe ich das Ergebniss in der console von Scite. Vieleicht kann diese ausgelesen werden ?

  • Zitat

    bei anderen befehlen wie ping oder chkdsk, wird der output zeile für zeile untereinander geschrieben,

    genau deshalb hatte ich das chkdsk ausgewählt, das schreibt nämlich in eine Zeile....hattest du mein Script mit dem lame-encoder mal ausprobiert?

  • ja hatte ich, und auch noch versucht drann zu schrauben, doch leider ohne erfolg. hat noch jemand eine idee.

    mit dem dos format befehl hatte ich das selbe problem. oder pscp ( scp client auf cmd ebene ) ebenfalls gescheitert.

    wenn keiner eine idee hat, werde ich denn fall wohl schließen, bevor er dann in vergesseheit gerät. :(

  • hi pretrojaner,

    lame liefert in der mir verfügbaren version auf stdout kein ergebnis!
    anders sieht die sache aus, wenn stderrread verwendet wird.

    vielleicht löst das dein problem?

    grüße vgun

  • hi pretrojaner,

    lame liefert in der mir verfügbaren version auf stdout kein ergebnis!
    anders sieht die sache aus, wenn stderrread verwendet wird.

    vielleicht löst das dein problem?

    grüße vgun

    hey klasse vgun,

    klappt tatzächlich, aber seltsam dachte ich hätte es so schon ausprobiert. na vieleicht lag der Fehler auch im Detail

    hier die version von Andy seinem script mit lame. thx @ all

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $line = "", $oldline = ""

    [/autoit] [autoit][/autoit] [autoit]

    SplashTextOn("STDOUT", "Bitte warten......")
    $Console = Run(@ComSpec & " /c lame.exe --disptime 0.5 -V9 --nohist input.wav output.mp3", @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $line &= StderrRead($Console)
    If @error Then ExitLoop
    If $line <> $oldline Then
    ControlSetText("STDOUT", "", "Static1", $line)
    $oldline = $line
    EndIf
    WEnd
    SplashOff()
    MsgBox(0, "STDOUT gesamt:", $line)

    [/autoit]

    so nun nur noch mit StringRegExp rumschlagen aber das dürfte einfacher werden. ;)

    gruß
    Pretrojaner

  • Hi,

    bei Regexp können wir auch gern helfen!

    Mega

    na interressieren würde es mich schon habe es mal via _stringbetween gelöst, vieleicht gibt es da noch eine saubere andere Lösung.

    hier mein code:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>
    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $line = "", $oldline = "", $proz = ""
    ProgressOn("lame coder", "input.wav - output.mp3", " %", -1, -1)

    [/autoit] [autoit][/autoit] [autoit]

    $Console = Run(@ComSpec & " /c lame.exe --disptime 0.2 -V9 --nohist input.wav output.mp3", @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line &= StderrRead($Console)
    If @error Then ExitLoop
    If $line <> $oldline Then
    $prozent = _StringBetween($line, "(", "%)|")
    If IsArray($prozent) Then
    _ArrayDelete($prozent, 0)
    If IsArray($prozent) Then
    $pzahl = _ArrayMax($prozent, 1, 1)
    ProgressSet($pzahl, $pzahl & " %")
    EndIf
    EndIf
    $oldline = $line
    EndIf
    WEnd
    ProgressOff()

    [/autoit]

    Gruß
    Pretrojaner

    • Offizieller Beitrag

    Hi,

    du könntest es so machen:

    [autoit]

    While 1
    $line &= StderrRead($Console)
    If @error Then ExitLoop
    If $line <> $oldline Then
    $prozent = StringRegExp($line, '(\d+)%', 3)
    If IsArray($prozent) Then ConsoleWrite($prozent[UBound($prozent) - 1] & " %" & @CRLF)
    $oldline = $line
    EndIf
    WEnd

    [/autoit]

    Wobei $line &= StderrRead($Console) auch noch $line = StderrRead($Console) sein könnte.

    Mega

  • Zitat

    Obwohl der Befehl "StringRegExp" und meiner einer stehen arg auf Kriegsfuß

    Willlkommen im Club^^

    Zitat

    Bin schon in der Versuchung eine Anleitung für Dummies zu suchen

    Dem Manne kann geholfen werden......oder auch ein nettes Beispiel