簡體   English   中英

VBScript-通過條件選擇與“ choice”命令一起使用shell命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM