【返回cmd命令的结果值 】(闪动命令框)
cmdReturn(command){
; WshShell 对象: http://msdn.microsoft.com/en-us/library/aew9yb99
shell := ComObjCreate("WScript.Shell")
; 通过 cmd.exe 执行单条命令
exec := shell.Exec(ComSpec " /C " command)
; 读取并返回命令的输出
return exec.StdOut.ReadAll()
}
【后台静默运行cmd命令缓存文本取值 】
【隐藏运行cmd命令并将结果存入剪贴板后取回 】
cmdClipReturn(command){
cmdInfo:=""
Clip_Saved:=ClipboardAll
try{
Clipboard:=""
Run,% ComSpec " /C " command " | CLIP", , Hide
ClipWait,2
cmdInfo:=Clipboard
}catch{}
Clipboard:=Clip_Saved
return cmdInfo
}
【StdoutToVar取命令结果(第三方)】
StdoutToVar_CreateProcess(sCmd, sEncoding:="CP0", sDir:="", ByRef nExitCode:=0) {
DllCall( "CreatePipe", PtrP,hStdOutRd, PtrP,hStdOutWr, Ptr,0, UInt,0 )
DllCall( "SetHandleInformation", Ptr,hStdOutWr, UInt,1, UInt,1 )
VarSetCapacity( pi, (A_PtrSize == 4) ? 16 : 24, 0 )
siSz := VarSetCapacity( si, (A_PtrSize == 4) ? 68 : 104, 0 )
NumPut( siSz, si, 0, "UInt" )
NumPut( 0x100, si, (A_PtrSize == 4) ? 44 : 60, "UInt" )
NumPut( hStdOutWr, si, (A_PtrSize == 4) ? 60 : 88, "Ptr" )
NumPut( hStdOutWr, si, (A_PtrSize == 4) ? 64 : 96, "Ptr" )
If ( !DllCall( "CreateProcess", Ptr,0, Ptr,&sCmd, Ptr,0, Ptr,0, Int,True, UInt,0x08000000
, Ptr,0, Ptr,sDir?&sDir:0, Ptr,&si, Ptr,&pi ) )
Return ""
, DllCall( "CloseHandle", Ptr,hStdOutWr )
, DllCall( "CloseHandle", Ptr,hStdOutRd )
DllCall( "CloseHandle", Ptr,hStdOutWr ) ; The write pipe must be closed before reading the stdout.
While ( 1 )
{ ; Before reading, we check if the pipe has been written to, so we avoid freezings.
If ( !DllCall( "PeekNamedPipe", Ptr,hStdOutRd, Ptr,0, UInt,0, Ptr,0, UIntP,nTot, Ptr,0 ) )
Break
If ( !nTot )
{ ; If the pipe buffer is empty, sleep and continue checking.
Sleep, 100
Continue
} ; Pipe buffer is not empty, so we can read it.
VarSetCapacity(sTemp, nTot+1)
DllCall( "ReadFile", Ptr,hStdOutRd, Ptr,&sTemp, UInt,nTot, PtrP,nSize, Ptr,0 )
sOutput .= StrGet(&sTemp, nSize, sEncoding)
}
; * SKAN has managed the exit code through SetLastError.
DllCall( "GetExitCodeProcess", Ptr,NumGet(pi,0), UIntP,nExitCode )
DllCall( "CloseHandle", Ptr,NumGet(pi,0) )
DllCall( "CloseHandle", Ptr,NumGet(pi,A_PtrSize) )
DllCall( "CloseHandle", Ptr,hStdOutRd )
Return sOutput
}
大神点评:建议用 StdoutToVar,避免弹出 CMD 窗口、产生临时文件等缺点。
建议用 StdoutToVar,避免弹出 CMD 窗口、产生临时文件等缺点。
V2版本的写法:
在V2版本中,可以这样:
GetCMDOutput(command){
Shell := ComObject("WScript.Shell")
exec := Shell.Exec(A_ComSpec " /C " command)
return exec.StdOut.ReadAll()
}
output := GetCMDOutput("echo %Date%")
MsgBox output
若要避免使用临时文件(尤其是在输出较大的情况下),请考虑使用 Shell.Exec() 方法,如 Run 命令的示例中所示。
或
; 下面的2个调用:cmd窗口将在第一次运行时快速闪烁一次
; 这是为了减轻每次调用shell.Exec时的闪烁
DllCall("AllocConsole")
WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr")