VBScript - 使用带有“choice”命令的条件执行来传递shell命令

时间:2016-09-04 05:17:26

标签: vbscript cmd choice conditional-execution

不确定这是否可行,但我正在尝试在一行中编写以下批处理脚本:

@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

上述工作按预期工作,直到达到选择命令,然后脚本无法正确执行其余部分。任何帮助解决这个问题都非常感谢。

2 个答案:

答案 0 :(得分:2)

这是来自帮助中的 Win32_OperatingSystem类主题的 Win32Shutdown方法 - https://msdn.microsoft.com/en-us/library/aa394058(v=vs.85).aspx

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)注销 - 将用户从计算机上注销。注销将停止与调用exit函数的进程的安全上下文关联的所有进程,将当前用户从系统中注销,并显示登录对话框。

     

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)都会立即关闭。因此,如果您对远程计算机运行脚本,则无法接收返回值。

答案 1 :(得分:1)

您可以在一行中编写批处理脚本,并记住GOTO command指示脚本跳转到带标签的。因此,您需要使用IF… ELSE… command syntax重写脚本,如下所示:

@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

==>