Moin,
meiner Meinung nach besteht der Sinn der
WScript.Shell Methode hauptsächlich darin, das umgebende System möglichst unangetastet zu lassen. Zum umgebenden System zählt für mich auch die Zwischenablage, deshalb hier folgende Alternative, die auch zu funktionieren scheint:
Code: Select all
#NoEnv
MsgBox % RunWaitEin("ping 8.8.8.8")
ExitApp
RunWaitEin(Befehl) {
Static OEMCP := "CP" . DllCall("GetOEMCP", "UInt")
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec " /C " Befehl)
result := exec.StdOut.ReadAll()
If (A_IsUnicode) {
VarSetCapacity(oemstr, StrPut(result, "CP0"), 0)
StrPut(result, &oemstr, "CP0")
}
Return StrGet(A_IsUnicode ? &oemstr : &result, OEMCP)
}
Für die Clipboard-Methode braucht es den Umweg über die
WScript.SHell nicht:
Code: Select all
#NoEnv
MsgBox % RunWaitEinClip("ping 8.8.8.8")
ExitApp
RunWaitEinClip(Befehl) {
SavedClip := ClipboardAll
RunWait, %ComSpec% /c %Befehl% | Clip, , Hide
Result := Clipboard
Clipboard := SavedClip
Return Result
}
Übrigens: Zum Sichern der kompletten Zwischenablage sollte es
OldClip := ClipboardAll sein.