#include <WinAPIFiles.au3>

; Hier den gewünschten Befehl eingeben, z.B. :
;  'dir' , 'net user' , 'netsh wlan disconnect'  etc.
; Falls Parameter übergeben werden, dann mit "" umgeben, z.B. :
;  'dir "' & @WindowsDir & '"'

Global $sCommand = 'dir'
Global $sSTDOUT = _GetCMDOutput($sCommand)

; als Konsolenmeldung :
ConsoleWrite(_ConvertOEMtoANSI($sSTDOUT) & @CRLF)

; alternativ als MessageBox :
MsgBox(0, "Meldung : ", _ConvertOEMtoANSI($sSTDOUT) & @CRLF)


; ========== Hilfsfunktionen ===========================================================================

; ------------------------------------------------------------------------------------------------------
; Funktion     : _ConvertOEMtoANSI
; Beschreibung : Konvertiert einen OEM-String zu ANSI
; Hintergrund  : Auswertung des Ausgabestreams für Befehle der Eingabeaufforderung (cmd.exe).
;                Normalerweise erfolgt die Anzeige, z.B. von 'net user' oder 'dir', im Konsolenfenster.
;                Häufig startet man die Konsole aber versteckt(@SW_HIDE), und wertet den Konsolenstream
;                in AutoIt mittels 'StdoutRead' aus.
; Problem      : Sonderzeichen wie Umlaute werden im Konsolenfenster korrekt, im Stream aber fehlerhaft
;                dargestellt. Diese Funktion konvertiert den Konsolenstream nach ANSI.
; ------------------------------------------------------------------------------------------------------
Func _ConvertOEMtoANSI($sOEM)
    Local $aDLLReturn, $sAnsi

	$aDLLReturn = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
	If @error Then
		$sAnsi = $sOEM  ; im Fehlerfall den Originalstring unkonvertiert zurückgeben
	Else
		$sAnsi = $aDLLReturn[2]
	EndIf

	Return $sAnsi
EndFunc   ;==>_ConvertOEMtoANSI

; ------------------------------------------------------------------------------------------------------
; Funktion     : _GetCMDOutput
; Beschreibung : Ausführen eines Befehls über die Konsole (für Standardbefehle)
;                - StdoutRead : Liest STDOUT-Stream eines 'Run' Childprozess.
;                  Benötigt die Prozess-ID des Childprozesses (also von 'Run').
; Returns      : StdoutRead als TextString(auch mehrzeilig)
; ------------------------------------------------------------------------------------------------------
Func _GetCMDOutput($sCommand)
	Local $iPID        ; ProcessID des Childprozesses
	Local $sText = ""  ; Text aus StdoutRead

	; WICHTIG : 'Run' verwenden, nicht 'RunWait' !
	;           -> 'Run' liefert eine ProcessID zurück (wird für StdoutRead benötigt)
	;           -> 'RunWait liefert einen ExitCode zurück (STDOUT-Stream wäre damit leer)
	$iPID = Run(@COMSPEC & ' /c ' & $sCommand, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
	If Not @error Then
		ProcessWaitClose($iPID)
		$sText = StdoutRead($iPID)
	EndIf

	Return StringStripWS($sText, BitOR($STR_STRIPLEADING, $STR_STRIPTRAILING))
EndFunc	;==>_GetCMDOutput