Programm per Shell ausführen, und ggf. eine Frage beantworten

  • Hallo,

    ich muss zugeben das ich noch nicht viel mit AutoIT gemacht habe und deswegen stellt sich meine Aufgabe als ein Problem für mich dar.

    Ich versuche die Reparatur einer Datei zu automatisieren.
    Hierzu muss der Befehl "Bootrec.exe /rebuildbcd" per Windows Commandline aufgerufen werden.
    Leider hat der Befehl meistens eine Abfrage drin:
    "Add installation to boot list? Yes(Y)/No(N)/All(A)"
    Wo man auf "A" drücken müsste. Ab und zu passiert es jedoch, dass der Befehl ohne diese Abfrage durcharbeitet.

    Ich habe bereits versucht das Problem per Piping (echo "A" | bootrec.exe ...) zu lösen, jedoch scheint der Befehl die STDIN eingabe nicht zu aktzeptieren.

    Hat jemand einen Tipp für mich, mit welchen Befehlen oder Funktionen ich hier am besten in AutoIT arbeiten müßte?

    Vielen Dank im Voraus.

    Gruß
    Robert

  • Poste bitte das Script was Du bis dato fertig hast, so das man sich das ansehen kann und ggf. eine Lsg. posten kann.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Aktuell hänge ich noch am ausgeben der Ausgabe:

    Code
    #include <Constants.au3>
    
    
    Local $foo = Run(@ComSpec & " /c BootRec.exe","", @SW_MAXIMIZE, $STDOUT_CHILD)
    Local $line
    While 1
    	$line = StdoutRead($foo)
    	If @error Then ExitLoop
    	MsgBox(0, "script sagt", $line)
    Wend

    Hiernach kommen 2 Messageboxen die beide nichts enthalten.
    Wenn ich jedoch andere Befehle probiere, wie z.B. "net", funktioniert die Ausgabe einwandfrei.

    Wenn ich den Befehl ganz normal in der Commandline eingebe, bekomme ich die gesamten Hilfeparameter.


    Gruß
    Robert

  • Hallo Metrax !

    Ein fehler hast du auf den ersten blick!

    [autoit]

    Local $foo = Run(@ComSpec & " /c BootRec.exe","", @SW_MAXIMIZE, $STDOUT_CHILD)

    [/autoit]


    es solte so aussehen! Du könntest auch RunWait nehmen!

    [autoit]

    Local $foo = RunWait(@ComSpec & ' /c ' & ' BootRec.exe','', @SW_MAXIMIZE, $STDOUT_CHILD)

    [/autoit]

    Und deine frage habe ich nicht ganz verstanden, also in verschidenen momenten läuft die .exe ohne die nachfrage????????

    LG Kleiner

  • Hi,

    Danke für die Antwort.

    [autoit]

    Local $foo = RunWait(@ComSpec & ' /c ' & ' BootRec.exe','', @SW_MAXIMIZE, $STDOUT_CHILD)

    [/autoit]

    Wenn ich das so ausführe, kommen die Popups gar nicht erst :( Wenn ich das Wait wegnehme, kommen wieder 2 Popups, beide jedoch leer.

    Zitat

    Und deine frage habe ich nicht ganz verstanden, also in verschidenen momenten läuft die .exe ohne die nachfrage????????

    Genau. Ich bastel gerade an einer Reparaturkonsole für Windows Vista/7/2008-Systeme. Dieses führt 3 Befehle nach einnander aus. Die ersten beiden benötigen keine Interaktion. Der 3te ist der hier beschriebene BootRec.exe mit der Option "/rebuildbcd". Dieses schreibt die BCD-Datei der Windows-Systeme neu, wenn Sie beschädigt ist. Wenn Sie beschädigt ist, stellt das Tool jedoch noch die Frage "Add installation to boot list? Yes(Y)/No(N)/All(A)", welchem man mit einem A beantworten müßte. Wenn Sie nicht beschädigt ist, läuft das Script ohne Nachfrage durch.

    Gruß
    Robert

  • Habe grade in die hilfe geschaut da wird das so beschriben!

    [autoit]

    ; Demonstriert StdoutRead()
    #include <Constants.au3>

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

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT gelesen:", $line)
    WEnd

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

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR gelesen:", $line)
    WEnd

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

    MsgBox(0, "Debug", "Wie aufregend...")

    [/autoit]


    also solte deins so doch gehen ausser du hast die datei nicht in windows liegen, kenn mich nicht mit vista aus!

    [autoit]

    #include <Constants.au3>

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

    Local $foo = Run(@ComSpec & " /c BootRec.exe",@SystemDir, @SW_MAXIMIZE, $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "script sagt", $line)
    Wend

    [/autoit]

    Oder immer noch nicht

    LG Kleiner


    Nachtrag: ich habe Das ( dir ) übersehen das könntest du auch noch mitrein nehmen!
    so

    [autoit]

    #include <Constants.au3>

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

    Local $foo = Run(@ComSpec & " /c dir BootRec.exe",@SystemDir, @SW_MAXIMIZE, $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "script sagt", $line)
    Wend

    [/autoit]


    und wenn die datei wo anders liegt pass den pfad an!


    _

    Einmal editiert, zuletzt von kleiner27 (23. September 2009 um 13:38)

  • Ich habe das mal so gemach!
    Nur mit pfad angabe und befehl!

    [autoit]

    #include <Constants.au3>

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

    Local $foo = Run("C:\WINDOWS\system32\cmd.exe "& " /c " &"ping localhost ","", @SW_MAXIMIZE, $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "script sagt", $line)
    Wend

    [/autoit]


    cmd.exe kannst mit "BootRec.exe" und ping locahost mit "/rebuildbcd". ersetzen und testen!

  • Vielen Dank für deine Bemühungen.

    Ich habe mittlerweile herausgefunden, dass es wohl an der BootRec.exe liegt, dass die Ausgabe nicht per Script abgreifbar ist.

    Ich muss es nun mit einer anderen Lösung probieren, die jedoch wesentlich aufwendiger ist :(