VBScript - 使用条件执行和"choice"命令传递外壳命令



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

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

4 (0x4) Forced Log Off(0 + 4) -将用户立即注销计算机,并且不通知应用程序登录会话即将结束。这可能导致数据丢失。

1 (0x1)关机-将计算机关闭到可以安全关闭电源的位置。(所有文件缓冲区将刷新到磁盘,所有正在运行的进程将停止。)用户看到"现在可以安全关闭计算机"的消息。在关机期间,系统向每个正在运行的应用程序发送一条消息。应用程序在处理消息时执行任何清理操作,并返回True以指示它们可以被终止。

5 (0x5)强制关机(1 + 4)-将计算机关闭到可以安全关闭电源的位置。(所有文件缓冲区将刷新到磁盘,所有正在运行的进程将停止。)用户看到"现在可以安全关闭计算机"的消息。当使用强制关闭方法时,所有服务(包括WMI)都会立即关闭。因此,如果在远程计算机上运行脚本,将无法接收返回值。

2 (0x2) Reboot -关闭并重新启动计算机。

6 (0x6) Forced Reboot(2 + 4) -关闭并重新启动计算机。当使用强制重启方法时,所有服务(包括WMI)都会立即关闭。因此,如果在远程计算机上运行脚本,将无法接收返回值。

8 (0x8) Power Off -关闭计算机并关闭电源(如果相关计算机支持)。

12 (0xC) Forced Power Off(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
)

出于调试目的(即查看输出),在下一个在线程序中,将每个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

Output:第一次运行时按下X,第二次运行时按下Y(或不按)。

==> cscript //nologo D:VB_scriptsSO39313751.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_scriptsSO39313751.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
==>

相关内容

  • 没有找到相关文章

最新更新