0

Not sure this is doable but I'm trying to write the following batch script in a single line:

@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

The above script needs to be passed via the vbs run command into cmd. The following is the closest I can get it:

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

The above works as expected up until the choice command is reached then the script fails to execute the remainder correctly. Any help in resolving this is very much appreciated.

4

2 回答 2

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

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

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

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

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

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

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

12 (0xC) 强制关机 (8 + 4) - 关闭计算机并关闭电源(如果相关计算机支持)。当使用强制关机方式时,包括WMI在内的所有服务都会立即关闭。因此,如果您在远程计算机上运行脚本,您将无法接收返回值。

于 2016-09-04T20:27:38.827 回答
1
于 2016-09-04T06:40:39.947 回答