批处理中的关闭命令表现为睡眠命令,如何修复?

3
我从这个网站上的其他帖子和我的初学知识中创建了这个批处理文件。它的目的是在设定时间后关闭或使计算机进入睡眠状态,以便我可以将其保留完成任务,而不必在完成后整夜运行。
问题在于,如果我运行关闭命令,它似乎会关闭电源,但打开时会恢复所有打开的应用程序,并且有时无法正确启动。(例如,需要启动1-2次才能实际上开机,而不是在几分钟后再次关闭。)
正在运行全新安装的Windows 10家庭版x64
这是我的文件的完整代码:
@echo off 
color 3F
mode con: cols=52 lines=5
echo Minutes until event?
set /p min=
set /a sec="min * 60"
echo Shutdown-1 or Sleep-2
set /p eventtype=
if %eventtype%==1 goto :shutdown
if %eventtype%==2 goto :sleep
:shutdown (
cls
echo Shutdown in %min% minutes at:
for /F "tokens=1-3 delims=:." %%a in ("%time%") do (
   set timeHour=%%a
   set timeMinute=%%b
   set timeSeconds=%%c
)
rem Convert HH:MM to minutes + %min%
set /A newTime=timeHour*60 + timeMinute + %min%
rem Convert new time back to HH:MM
set /A timeHour=newTime/60, timeMinute=newTime%%60
rem Adjust new hour and minute
if %timeHour% gtr 23 set timeHour=0
if %timeHour% lss 10 set timeHour=0%timeHour%
if %timeMinute% lss 10 set timeMinute=0%timeMinute%
echo %timeHour%:%timeMinute%:%timeSeconds%
timeout /t %sec% /nobreak
start shutdown.exe /s /t 00
)
:sleep (
cls
echo Sleep in %min% minutes at:
for /F "tokens=1-3 delims=:." %%a in ("%time%") do (
   set timeHour=%%a
   set timeMinute=%%b
   set timeSeconds=%%c
)
rem Convert HH:MM to minutes + %min%
set /A newTime=timeHour*60 + timeMinute + %min%
rem Convert new time back to HH:MM
set /A timeHour=newTime/60, timeMinute=newTime%%60
rem Adjust new hour and minute
if %timeHour% gtr 23 set timeHour=0
if %timeHour% lss 10 set timeHour=0%timeHour%
if %timeMinute% lss 10 set timeMinute=0%timeMinute%
echo %timeHour%:%timeMinute%:%timeSeconds%
timeout /t %sec% /nobreak
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
)

感谢您对组件进行格式化。 - Imondeck
尝试只运行以下命令 start shutdown.exe /s /t 00,在这种情况下它是否能够正常关机? - PKey
@Plirkee 是的,它按预期工作。 - Imondeck
好的,所以你最后两次回答之间存在矛盾... /t 00 怎么不会关机,但同时又说“当在事件前不到5分钟运行时有效”。然而,根据你最后的回答,我认为你应该更改电源设置,这样它就不会在空闲一段时间后进入睡眠状态...看一下这里...可能有帮助。 - PKey
@Plirkee 当“插入电脑后,进入睡眠模式”设置为“从不”时,它确实是相互矛盾的。我不确定原因,因为我在之前的操作系统安装中遇到了这个问题(SSD损坏,最近刚刚更换),并且可以确认在之前的安装中已将睡眠设置为“从不”。但这次我忘记了这样做,现在已经更改,并将测试是否解决了问题。 - Imondeck
显示剩余2条评论
2个回答

1

现在它可以正常工作了!感谢@Compo和@Plirkee提供的帮助。

以下是经过编辑的完全功能代码,如果有人想要使用它们:

@echo off
color 3F
mode con: cols=52 lines=5
echo Minutes until event?
set /p min=
set /a sec="min * 60"
echo Shutdown-1 or Sleep-2
set /p eventtype=
if %eventtype%==1 goto :shutdown
if %eventtype%==2 goto :sleep
:shutdown
cls
echo Shutdown in %min% minutes at:
for /F "tokens=1-3 delims=:." %%a in ("%time%") do (
   set timeHour=%%a
   set timeMinute=%%b
   set timeSeconds=%%c
)
rem Convert HH:MM to minutes + %min%
set /A newTime=timeHour*60 + timeMinute + %min%
rem Convert new time back to HH:MM
set /A timeHour=newTime/60, timeMinute=newTime%%60
rem Adjust new hour and minute
if %timeHour% gtr 23 set timeHour=0
if %timeHour% lss 10 set timeHour=0%timeHour%
if %timeMinute% lss 10 set timeMinute=0%timeMinute%
echo %timeHour%:%timeMinute%:%timeSeconds%
timeout /t %sec% /nobreak
shutdown /p
:sleep
cls
echo Sleep in %min% minutes at:
for /F "tokens=1-3 delims=:." %%a in ("%time%") do (
   set timeHour=%%a
   set timeMinute=%%b
   set timeSeconds=%%c
)
rem Convert HH:MM to minutes + %min%
set /A newTime=timeHour*60 + timeMinute + %min%
rem Convert new time back to HH:MM
set /A timeHour=newTime/60, timeMinute=newTime%%60
rem Adjust new hour and minute
if %timeHour% gtr 23 set timeHour=0
if %timeHour% lss 10 set timeHour=0%timeHour%
if %timeMinute% lss 10 set timeMinute=0%timeMinute%
echo %timeHour%:%timeMinute%:%timeSeconds%
timeout /t %sec% /nobreak
rundll32.exe powrprof.dll,SetSuspendState 0,1,0

-1
我注意到您关闭计算机的方式是使用shutdown.exe。您可以简单地使用shutdown命令。因此,您可以使用shutdown /s /t 00代替start shutdown.exe /s /t 00
这可能是解决方法,值得一试。至少,这可以为您节省10个字符。

1
他们的关机命令没有问题,尽管可以简化为 shutdown /p - Compo
1
如果不是解决方案,那么就不应该作为答案发布,而应该作为评论。正如@Compo所说,他们使用shutdown的方式没有任何问题。 - Squashman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接