1. 程式人生 > >在批處理中調用VBScript(支持獲取返回值)

在批處理中調用VBScript(支持獲取返回值)

都是 exp sap net 什麽 api 獲得 鏈接 結果

有個帖子簡單介紹了利用mshta來調用vbs的方法(鏈接)。
雖該文章作者認為

到此,在bat中使用vbs得到了完全解決。從此可以在bat和vbs間自由的航行了。

但任然無法獲取vbs的返回值,可見該方法有一定缺陷。
於是寫出該帖子來補充一下下~
先不看這個缺陷,原調用代碼的html標簽也可以不要(lz最早是看見zhonghua兄使用該方法)

Mshta Vbscript:VBS命令(Close)

感謝zhonghua,我們來看幾個例子:

Mshta Vbscript:Msgbox("Hello,world!")(Close)
Mshta Vbscript:CreateObject("SApi.SpVoice").Speak("Hello,world!"&vbNewLine&"你好,世界!")(Close)
Mshta Vbscript:Msgbox("該電腦的設備和驅動器共有"&CStr(CreateObject("Scripting.FileSystemObject").Drives.Count)&"個。")(Close)

註意幾點:
1、在例1中,Msgbox語句與後面的(Close)之間無需加任何符號,添加:還會報錯。
2、在例2中,雖然SApi.SpVoice函數的.Speak方法嚴格來說是一個過程,但是因為Mshta接收的參數有限以及其他各種原因,必須用括號包裹而不是空格分隔。

再看一段代碼:

@echo off
Setlocal enabledelayedexpansion
::CODER BY 老劉 POWERD BY iBAT
Mshta Vbscript:Msgbox("Hello,world!",1)(Close)
Echo %Errorlevel%
pause

測試者會發現無論點擊哪個按鈕,返回值都是0。
可能這個例子舉得有些牽強,即使有返回值也不一定要從%Errorlevel%來返回是吧~
但是這是批處理獲取其他Console程序的結果的方法之一。
既然這種方法不行,那我們為什麽不試試另一種方法呢?
我們經常能看到批處理使用For/f+(‘Commands‘)的方法獲取程序輸出。
那麽能否使用這種方法獲取VBS代碼運行後的返回值呢?
答案是肯定的,首先感謝PCL_Test斑竹。
來看我封裝好的代碼塊:

Set Vbscript=VBS命令
for /f "Delims=" %%a in (
‘MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(close^)‘
) do Set "MsHtaReturnValue=%%a"
Set MsHtaReturnValue

該方法lz最初看到pcl斑竹使用,就拿來封裝了下。
使用這種方法就可以獲取Vbs代碼運行的返回值了~
來修改剛才的例子:

@echo off
Setlocal enabledelayedexpansion
::CODER BY 老劉 POWERD BY iBAT
Set Vbscript=Msgbox("Hello,world!",1)
for /f "Delims=" %%a in (
‘MsHta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(%Vbscript:"=""%)"^)(Close^)‘
) do Set "MsHtaReturnValue=%%a"
Set ReturnValue1=確定
Set ReturnValue2=取消或關閉窗口
Echo 你點擊了!ReturnValue%MsHtaReturnValue%!。
pause

這樣就可以正常運行了,雞凍吧~
但是這樣還有一個缺陷,Mshta運行時當前窗口會失去焦點(即當前窗口變灰),
當Mshta運行完畢後,窗口焦點又會恢復。
所以調用次數少或者腳本運行環境的電腦無鼠標操作的時候,可以放心使用該方法獲得返回值。
但是如果要大量調用,還需要順便幹幹其他什麽事情的話,還是單獨寫一個Vbs調用較好。

在批處理中調用VBScript(支持獲取返回值)