Daten einlesen via CMD

  • Guten Abend AutoIT Community,

    Ich habe ein Problem mit einem Teil meines Scripts.
    Und zwar, soll via CMD ein Befehl ausgeführt werden, und das jeweilige Ergebniss eingelesen werden.

    Allerdings klappt das nicht so wie ich mir das wünsche. Bevor der Teil unten ausgeführ wird, kommt noch der erwähnte CMD Befehl, der alle Ordner und Unterordner von C:\ auflisten soll (getestet hab ichs, aber Ahnung habe ich nicht :rolleyes: , CMD ist nicht unbedingt mein "Ding")

    Code
    DIR C:\ /S /B


    [autoit]

    While 1

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

    $line = StdoutRead($cmdProcess)
    _ArrayAdd($files[$count], $line)
    if @error Then ExitLoop
    redim $line[$count + 1]
    $count = $count + 1

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

    WEnd

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

    MsgBox(4096,"File number","You have " & $count & " files chosen.", 10)

    [/autoit]

    Es kommt immer wieder direkt die MsgBox. zuvor führt

    Ich würde fast drauf wetten, das ich im Ansatz falsch bin.

    Also, kann mir da jemand helfen? Bis zu einem gewissen Grad konnte ich den Fehler ja einschränken...

    Danke schon mal im vorraus,

    Jok[e]Cracker

    Einmal editiert, zuletzt von Jok[e]Cracker (3. April 2012 um 19:37) aus folgendem Grund: unnützes Zeug entfernt

  • Ehrlich gesagt, kann ich nicht wirklich viel damit anfangen, da ich keine offenen Ports suche, sondern nur die Ausgabe dieses einen (oben genannten) CMD Befehls.

    Es muss doch möglich sein, die Ausgabe von CMD in einem Array zu speichern...

    • Offizieller Beitrag

    Warum willst Du das nicht komplett in AutoIt machen?

    Zum Beispiel so:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $iTimer = TimerInit()
    $sDir = 'C:'
    $array = _RecursiveFileListToArray($sDir, '', 2)
    ConsoleWrite(TimerDiff($iTimer) & @CR)
    If IsArray($array) Then
    _ArrayDisplay($array)
    EndIf

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

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $fRecursion][, $sDelim])
    ; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $fRecursion = Verzeichnisse rekursiv durchsuchen
    ; False = Nein
    ; True = Ja
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]
  • Hi,

    ...oder du änderst den CMD Befehl so, dass die Ausgabe in eine Datei umgeleitet wird:

    Code
    DIR C:\ /S /B >C:\Users\%USERNAME%\Desktop\Beispiel.txt

    ...und liest diese Datei (Beispiel.txt) dann mit AutoIt aus:

    [autoit]

    $data = FileRead("C:\Users\"&@USERNAME&"\Desktop\Beispiel.txt")

    [/autoit]

    Noch was... Den CMD-Befehl kannst du übrigens so in AutoIt aufrufen:

    [autoit]

    ShellExecuteWait("cmd.exe","/C DIR C:\ /S /B >C:\Users\%USERNAME%\Desktop\Beispiel.txt","","",@SW_HIDE)

    [/autoit]

    Das ist ungetestet, sollte aber funktionieren.

    Viel Spaß :D

    5 Mal editiert, zuletzt von CyRoX (4. April 2012 um 19:23)

  • Danke, ich werde beide Methodemn nachher ausprobieren...

    Die Sache mit der Dateiausgabe - da hätte ich mit ein bisschen Intelligenz selber drauf kommen können...

    Mal ne Frage zu der Dateiausgabe: wie stopfe ich das in einem Array??

    Danke!

  • Mal davon ab, dass man es auch auf anderem Wege lösen kann (siehe Beispiele oben) - Das wichtigste hast du nicht gepostet, nämlich deinen run Aufruf. Ich gehe mal stark davon aus, dass genau dort der Fehler liegt. In der Hilfe zu stdoutread findest du im übrigen ein passendes Beispielscript, in dem zufälligerweise sogar der DOS Befehl "dir" verwendet wird. Minimalst abgeändert und du bist bereits am Ziel. ;)

    EDIT:

    Ausserdem verlässt du die Schleife wenn es zum Fehler beim beschreiben des Arrays kommt und nicht wenn es zum Fehler beim lesen des stdouts kommt. Das Problem könnte also theoretisch auch von arrayadd herrühren, um das beurteilen zu können fehlt aber wiederum dein restlicher Quellcode.

    EDIT2:

    Ahja und sofern das der vollständige Restcode sein sollte... was erwartest du ausser der msgbox? Du lässt dir den Array Inhalt ja überhaupt nicht anzeigen (_arraydisplay() ????), also kann nur eine msgbox erscheinen.


    EDIT3:

    Nochmals hingeschaut bestätigt sich meine erste Vermutung, der Fehler kommt vom arrayadd(), weil du die Funktion mit einem ungültigen Parameter fütterst. Anstelle des Arrays das befüllt werden soll übergibst du einen Wert des Arrays. Deine Variable count und das Neudimensionieren des Arrays mit redim ist ebenfalls überflüssig wenn man arrayadd verwendet, da diese Funktion das selbst übernimmt.

    4 Mal editiert, zuletzt von misterspeed (4. April 2012 um 20:57)

  • Kannst du mir auch sagen, wie der Code Ausschnitt denn aussehen müsste, denn ich bin halt ein Noob :D