Diskpart vs DOS Shell lesen

  • Hallo,

    ich versuche auf einem WDS die DOS und WSH Scripte durch AutoIt Scripte zu ersetzen. 
    Bei normalen Dos Shell Befehlen funktioniert das ganz gut, aber in Telnet oder Diskpart Consolen
    schaffe ich es nicht Befehle über STDIN STDOut zu senden oder zu empfangen. Deswegen hab ich es
    mit ständigem lesen der DOS Shell ohne Eingabe also DISKPART /s KILLDISK.ini oder aber mit
    Diskpart als direkter Console versucht. Zusätzlich habe ich sleep Befehle eingesetzt was ungefähr meinen
    Wissentsstand in Bezug auf Programmierung darstellt und natürlich ist das meiste nicht einmal von mir.

    Die Idee war:

    diskpart-------------------------------- Ausgabe in Form mit Progessbar: Festplattenverwaltung wird gestartet
    select disk 0
    clean------------------------------------ Ausgabe in Form mit Progressbar: Festplatte wird bereingt
    create partition primary-------------- Ausgabe in Form mit Progressbar: Primäry Partition erstellt

    usw.

    Wäre schön wenn mir jemand weiterhelfen könnte. Hier mein bisheriges Script.

    [autoit]


    #include <Constants.au3>
    #include <array.au3>

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

    ;Global $DOSBOX = Run("CMD.EXE", @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
    Global $DOSBOX = Run("CMD.EXE", @ScriptDir, @SW_SHOW, $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
    Global $CLines
    Local $CSTR
    Func _KillEmpty(ByRef $Array)
    Local $tmp[1]
    For $i = 1 To $Array[0]
    If $Array[$i] <> "" Then _ArrayAdd($tmp, $Array[$i])
    Next
    $tmp[0] = UBound($tmp) - 1
    $Array = $tmp
    EndFunc
    Func CheckReady(ByRef $Array,$CheckSTR)
    If $Array[$Array[0]] = $CheckSTR Then
    ;SystemPrompt löschen
    _ArrayDelete($Array,$Array[0])
    $Array[0] = UBound($Array) - 1
    ;Befehl lasse ich in Zeile eins deswegen auskommentiert
    ;_ArrayDelete($Array,$Array[1])
    ;$Array[0] = UBound($Array) - 1
    Return True
    Else
    Return False
    EndIf
    EndFunc
    Func GetDosBoxText($CheckSTR)
    DIM $STDOutText

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

    Sleep(10)
    While 1
    $STDOutText &= StdoutRead($DOSBOX)
    If @error Then ExitLoop
    if $STDOutText <> "" Then
    $CLines = StringSplit($STDOutText,@CRLF,1)
    ; Suchen nach Path & > wenn in letzter Zeile Befehl zu ende
    if CheckReady($CLines,$CheckSTR) Then
    _KillEmpty($CLines)
    ;For $I = 1 to $CLines[0]
    ; msgbox(0,"","Zeile " & $I & ": " & $CLines[$I])
    ;Next

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

    Return True
    ExitLoop
    Else
    sleep(100)
    EndIf
    EndIf
    WEnd

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

    if @error then
    While 1
    $STDOutText &= StderrRead($DOSBOX)
    If @error Then ExitLoop
    if $STDOutText <> "" Then
    MsgBox(0, "------------- NU IS PUT ------------------", $STDOutText)
    $CLines = StringSplit($STDOutText,@CRLF,1)
    _KillEmpty($CLines)
    For $I = 1 to $CLines[0]
    msgbox(0,"","Zeile " & $I & ": " & $CLines[$I])
    Next
    Return False
    ExitLoop
    EndIf
    Wend
    Sleep(10)
    EndIf
    EndFunc

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

    ; In diesem Moment ist CMD gestartet
    ; bis wohin möchte ich lesen
    ; bis Befehl beendet
    ; Befehl beendet wenn Command Inhalt wieder c:\autoit\test> also CommandoPrompt
    $CSTR = @ScriptDir & ">"
    ; liest alle CMD Shell Rückmeldungen bis $CSTR
    GetDosBoxText($CSTR)
    ; Rückgabe Wert ist Array
    ; Danke an den König und das Alien in Globaler Variable $Clines
    $CText = ""
    for $i = 1 to $CLines[0]
    $CText &= $CLines[$i] & @CRLF
    Next
    MsgBox(0,"Command Ergebnis",$CText)

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

    ; Innerhalb einer Console wie Diskpart können keine Befehle gesendet werden
    ; Ausgabe kann aber empfangen werden
    ; Starte diskpart im Script Modus und werte Ergebnisse aus

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

    ; Sobald versucht wird innerhalb von Diskpart zu lesen bleibt bei jedem zweitem oder dritten Versuch die Console einfach stehen
    ; man erhält zwar letztendlich alle Informationen wenn man die Console schliesst
    ; aber ich hatte gehofft die Ergebnisse Schritt für Schritt abfangen zu können

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

    StdinWrite($DOSBOX,"diskpart /s diskpart.ini" & @CRLF)

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

    $CSTR = @ScriptDir & ">"
    GetDosBoxText($CSTR)
    $CText = ""
    for $i = 1 to $CLines[0]
    $CText &= $CLines[$i] & @CRLF
    Next
    MsgBox(0,"Command Ergebnis",$CText)

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

    StdinWrite($DOSBOX,"dir c:\" & @CRLF)

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

    $CSTR = @ScriptDir & ">"
    GetDosBoxText($CSTR)
    $CText = ""
    for $i = 1 to $CLines[0]
    $CText &= $CLines[$i] & @CRLF
    Next
    MsgBox(0,"Command Ergebnis",$CText)

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

    MsgBox(0, "", "Nu is Ende...")

    [/autoit]


    Gruß
    Bountry

    3 Mal editiert, zuletzt von AutoIt@Forms (15. Mai 2009 um 23:37)