不确定这是可行的,但我正试图在一行中编写以下批处理脚本:
@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
==>