2012-10-01 296 views
7

我想使用Windows腳本(.vbs)從命令行(cmd.exe)獲取簡單命令的結果。這是如何完成的?我一直無法找到一個好的/簡單的例子或解釋。您可以使用「日期」或「時間」命令來提供示例。 如:vbs如何從命令行命令獲得結果

enter image description here

P.S.我可以編寫打開cmd.exe的腳本代碼併發送命令。

謝謝!

+0

加1因爲該圖很棒:o –

回答

10

如有疑問,請閱讀documentation。你可能想是這樣的:

Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t") 
Do While p.Status = 0 
    WScript.Sleep 100 
Loop 
WScript.Echo p.StdOut.ReadAll 

編輯:使用Exec()您通過.StdIn描述符傳輸入,而不是通過SendKeys()(這是通過輸入反正一個相當不可靠的方式)。

%COMSPEC%是與完整路徑cmd.exe/c選項系統環境變量的命令(date /t中的例子)完成後cmd.exe出口使得。

如果該命令指出了一個退出代碼成功/失敗,您可以檢查ExitCode財產的命令結束後。

If p.Status <> 0 Then WScript.Echo p.ExitCode 

EDIT2:而不是使用atprogram交互,可以構建COMMANDLINES將無需用戶交互執行特定的任務?隨着非交互式COMMANDLINES這樣的事情可能工作:

prompt = "C:\>" 
atprogram_cmdline_1 = "atprogram.exe ..." 
atprogram_cmdline_2 = "atprogram.exe ..." 
'... 

Function ReadOutput(p) 
    text = "" 
    Do Until Right(text, Len(prompt)) = prompt 
    text = text & p.StdOut.Read(1) 
    Loop 
    ReadOutput = text 
End Function 

Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k") 
ReadOutput cmd ' skip over first prompt 

cmd.StdIn.WriteLine(atprogram_cmdline_1) 
WScript.Echo ReadOutput(cmd) 
cmd.StdIn.WriteLine(atprogram_cmdline_2) 
WScript.Echo ReadOutput(cmd) 
'... 

cmd.Terminate ' exit CMD.EXE 

%COMSPEC% /k產生一個命令提示符下不運行的命令。 /k阻止它關閉。由於它不會自動關閉,因此您不能在此使用While p.Status = 0循環。如果某個命令需要一些時間才能完成,則需要WScript.Sleep秒。

通過cmd.StdIn.WriteLine可以運行在CMD實例COMMANDLINES。功能ReadOutput()讀取StdOut的輸出,直到出現下一個提示。您需要查看提示,因爲讀取操作被阻止,所以您不能簡單地說「讀取所有已打印的內容」。

完成後,您通過cmd.Terminate退出CMD.EXE

+0

好的,有用,謝謝,但我想我並不期待這樣一個簡化的答案。我只會解釋我想要做的事情。我想用Atmel的基於命令行的編程來編程一些芯片。它使用起來非常簡單,而且運作良好。我能夠調出命令shell並使用SendKeys發送命令,但是當我嘗試使用Exec包含命令時,它只是彈出窗口但不插入命令。實際上做什麼是「/ c」?是否有另一種獲得命令輸出的方法?我需要一種方法來知道編程是否成功。 – user1387865

+0

感謝您的幫助!我很感激。我還沒有成功。由於某種原因,當我發送Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c atprogram")時,它只是打開終端而不輸入命令「atprogram」。我嘗試了幾件事,但它不會運行命令。我覺得我被迫使用SendKeys,但是除非我打開終端窗口,否則我看不到輸出。 – user1387865