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>
;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
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
Return True
ExitLoop
Else
sleep(100)
EndIf
EndIf
WEnd
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
; 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)
; 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
; 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
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)
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)
MsgBox(0, "", "Nu is Ende...")
[/autoit]Gruß
Bountry