[英]VBScript - Pass shell command using conditional execution with “choice” command
不確定這是否可行,但我試圖在一行中編寫以下批處理腳本:
@echo off
echo Shutdown initiated...
echo.
choice /c xy /n /t 10 /d y /m "To cancel shutdown press "X""
if errorlevel 2 goto EXEC
if errorlevel 1 goto ABORT
:EXEC
echo.
echo Computer shutting down
timeout /t 10
exit
:ABORT
echo.
echo Shutdown cancelled
timeout /t 10
exit
上面的腳本需要通過vbs run命令傳遞到cmd。 以下是我能得到的最接近的信息:
option explicit
dim wshell, strcmd
set wshell = createobject("wscript.shell")
if hour(now()) >= 0 and hour(now()) < 6 then
strcmd = "cmd /c @echo off & echo ""Pre-Dawn Shutdown initiated"" & echo. & choice /c xy /n /t 10 /d y /m ""To cancel shutdown press ""X"""" & if errorlevel 2 goto exec & if errorlevel 1 goto abort & :exec & echo. & echo ""Computer shutting down"" & timeout /t 10 & exit & :abort & echo. & echo ""Shutdown cancelled"" & timeout /t 10 & exit"
wshell.run strcmd
end if
上面的操作按預期進行,直到到達choice命令,然后腳本無法正確執行其余操作。 非常感謝您對解決此問題的任何幫助。
這是來自幫助-https://msdn.microsoft.com/zh-cn/library/aa394058 ( v= vs.85).aspx中Win32_OperatingSystem類主題的Win32Shutdown方法 。
Dim testResult
Dim WMIServiceObject, ComputerObject
'Now get some privileges
WMIServiceObject = GetObject(
"Winmgmts:{impersonationLevel=impersonate,(Debug,Shutdown)}")
ForEach ComputerObject In WMIServiceObject.InstancesOf("Win32_OperatingSystem")
testResult = ComputerObject.Win32Shutdown(0, 0) 'logoff
If testResult <> 0 Then
MsgBox("Sorry, an error has occurred while trying to perform selected operation")
EndIf
Next
這張桌子說了你想發生的事情。 (第一個參數)
0(0x0)注銷-將用戶注銷計算機。 注銷將停止與該進程的安全上下文相關聯的所有進程,該進程的安全上下文稱為退出功能,將當前用戶注銷從系統中,並顯示登錄對話框。
4(0x4)強制注銷(0 + 4)-立即使用戶注銷計算機,並且不通知應用程序登錄會話即將結束。 這可能會導致數據丟失。
1(0x1)關機-將計算機關機到可以安全關閉電源的地步。 (將所有文件緩沖區刷新到磁盤,並停止所有正在運行的進程。)用戶看到此消息,現在可以安全地關閉計算機了。 在關機期間,系統會向每個正在運行的應用程序發送一條消息。 應用程序在處理消息時執行任何清理,並返回True表示可以終止它們。
5(0x5)強制關機(1 + 4)-將計算機關閉到可以安全關閉電源的地步。 (將所有文件緩沖區刷新到磁盤,並停止所有正在運行的進程。)用戶看到此消息,現在可以安全地關閉計算機了。 使用強制關閉方法時,所有服務(包括WMI)都將立即關閉。 因此,如果在遠程計算機上運行腳本,則將無法收到返回值。
2(0x2)重新啟動-關閉然后重新啟動計算機。
6(0x6)強制重啟(2 + 4)-關閉然后重新啟動計算機。 使用強制重新啟動方法時,所有服務(包括WMI)都將立即關閉。 因此,如果在遠程計算機上運行腳本,則將無法收到返回值。
8(0x8)電源關閉-關閉計算機,然后關閉電源(如果有問題的計算機支持)。
12(0xC)強制關閉電源(8 + 4)-關閉計算機,然后關閉電源(如果有問題的計算機支持)。 使用強制關機方法時,所有服務(包括WMI)都將立即關閉。 因此,如果在遠程計算機上運行腳本,則將無法收到返回值。
您可以在一行中編寫批處理腳本,但要記住, GOTO
命令將使批處理腳本跳轉到標記的行 。 因此,您需要使用IF… ELSE…
命令語法來重寫腳本,如下所示:
@echo off
echo Shutdown initiated...
echo.
choice /c xy /n /t 10 /d y /m "To cancel shutdown press "X""
if errorlevel 2 (
rem goto EXEC
rem :EXEC
echo.
echo Computer shutting down
timeout /t 10
exit
) else if errorlevel 1 (
rem goto ABORT
rem :ABORT
echo.
echo Shutdown cancelled
timeout /t 10
exit
)
出於調試目的(即查看輸出),在下一個oneliner中,將每個exit
替換為pause
:
@echo Shutdown initiated...&echo.&choice /c xy /n /t 10 /d y /m "To cancel shutdown press "X""&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10&pause) else if errorlevel 1 (echo.&echo Shutdown cancelled&timeout /t 10& pause )
輸出 :
==> @echo Shutdown initiated...&echo.&choice /c xy /n /t 10 /d y /m "To cancel shutdown pres
s "X""&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10&pause) else if erro
rlevel 1 (echo.&echo Shutdown cancelled&timeout /t 10& pause )
Shutdown initiated...
To cancel shutdown press X X
Shutdown cancelled
Waiting for 0 seconds, press a key to continue ...
Press any key to continue . . .
==> @echo Shutdown initiated...&echo.&choice /c xy /n /t 10 /d y /m "To cancel shutdown pres
s "X""&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10&pause) else if erro
rlevel 1 (echo.&echo Shutdown cancelled&timeout /t 10& pause )
Shutdown initiated...
To cancel shutdown press X Y
Computer shutting down
Waiting for 0 seconds, press a key to continue ...
Press any key to continue . . .
稍稍修改了下一個VBScript
代碼段,再次用於調試目的。
option explicit
On Error GoTo 0
Dim strResult: strResult = Wscript.ScriptName
dim wshell, strcmd, Return
set wshell = createobject("wscript.shell")
if True or (hour(now()) >= 0 and hour(now()) < 6) then
strcmd = "cmd /c @echo Shutdown initiated...&echo." & _
"&choice /c xy /n /t 10 /d y /m ""To cancel shutdown press ""X""""" & _
"&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10" & _
"&exit /B 2) else if errorlevel 1 (echo." & _
"&echo Shutdown cancelled&timeout /t 10&exit /B 1)"
strResult = strResult & vbNewLine & strcmd
Return = wshell.run( strcmd, 1, True)
strResult = strResult & vbNewLine & CStr( Return)
end if
'strResult = strResult & vbNewLine &
Wscript.Echo strResult
輸出 :在第一次運行中按X
,在以后運行中按Y
(或不進行任何操作)。
==> cscript //nologo D:\VB_scripts\SO\39313751.vbs
39313751.vbs
cmd /c @echo Shutdown initiated...&echo.&choice /c xy /n /t 10 /d y /m "To cancel shutdown p
ress "X""&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10&exit /B 2) else
if errorlevel 1 (echo.&echo Shutdown cancelled&timeout /t 10&exit /B 1)
1
==> cscript //nologo D:\VB_scripts\SO\39313751.vbs
39313751.vbs
cmd /c @echo Shutdown initiated...&echo.&choice /c xy /n /t 10 /d y /m "To cancel shutdown p
ress "X""&if errorlevel 2 (echo. &echo Computer shutting down&timeout /t 10&exit /B 2) else
if errorlevel 1 (echo.&echo Shutdown cancelled&timeout /t 10&exit /B 1)
2
==>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.