不确定这是否可行,但我正在尝试在一行中编写以下批处理脚本:
@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
上述工作按预期工作,直到达到选择命令,然后脚本无法正确执行其余部分。任何帮助解决这个问题都非常感谢。
答案 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
==>