【问题标题】:Batch countdown but WITH showing countdown批量倒计时但显示倒计时
【发布时间】:2021-02-27 11:22:57
【问题描述】:

我知道它可以批量超时 30 等,但如何显示倒计时

我在这里看到: http://www.trytoprogram.com/batch-file/shutdown-commands/ BOTTOM Page“用于关闭、重启、休眠和注销计算机的批处理文件程序”

/t 0 没用过 /t 30 它没有显示倒计时

知道如何显示倒计时,例如:timeout 30 29 28 27 etc

【问题讨论】:

  • 是否可以接受常规的timeout /t 30,然后使用shutdown /s /t 0 立即关闭?
  • 如果您想在 30 秒内触发关闭进程,这很好,给最终用户 30 秒时间来关闭他们自己选择的打开文档并没有错和应用优先。但我认为没有理由 /force 关闭,因为这并不关心最终用户是否已成功、安全地保存他们的工作并关闭这些应用程序,然后可能会丢失未保存的数据。最好向最终用户提供消息,通知他们即将关闭,然后在特定延迟之后,不要/forcing 这样做。
  • 我非常怀疑添加倒计时是否有助于这种情况。最终用户应该正忙于尝试保存他们的工作等,并且到那时,将不再能够在不再聚焦的情况下读取倒数计时器,并且可能现在在其他窗口后面,它有任何窗口效果,而不是引入恐慌的感觉。

标签: batch-file countdown


【解决方案1】:

可以通过使用for /L 循环来确定秒数,并使用for /F 循环执行带有/T 1 延迟的choice 命令和/D 默认值(不执行任何操作)来实现计时器。

可以在For /F Choice 循环中内置其他选项,以允许取消关机、重置倒计时或立即关机:

 @Echo off
:Reset
 For /L %%i in (30 -1 1)Do (
  Cls
  Echo Shutting down in : %%i Seconds [C]ancel [S]hutdown Now [R]eset Timer
  For /F "Delims=" %%G in ('Choice /T 1 /N /C:CSRW /D W')Do (
   If %%G==R Goto :Reset
   If %%G==C Goto :Eof
   If %%G==S Shutdown /SG /T 0
  )
 )
 Shutdown /SG /T 1

编辑:

修改上述内容以用作从菜单调用的函数的示例。

@Echo off
:Menu
 Echo [E]xit [L]ogoff [R]estart [S]hutdown
 For /F "Delims=" %%G in ('Choice /N /C:SRLE')Do (
  If %%G==S Call :Timer "Shutdown /SG /T 1" "Shutting Down"
  If %%G==R Call :Timer "Shutdown /R /T 1" "Restarting"
  If %%G==L Call :Timer "Shutdown /L" "Logging Off"
  If %%G==E Exit /B
 )
:# On Cancel Command Selection:
Goto :Menu
:# Function With timer
:Timer [Command] [Prompt]
 For /L %%i in (30 -1 1)Do (
  Cls
  Echo %~2 in : %%i Seconds [C]ancel [R]estart Timer [N]o wait
  For /F "Delims=" %%G in ('Choice /T 1 /N /C:CRNW /D W')Do (
   If %%G==R Goto :Timer
   If %%G==C Goto :Eof
   If %%G==N %~1
  )
 )
 %~1

【讨论】:

  • This is Brilliant 你也可以添加其他 2 选择吗?如果可能,注销并重新启动
  • 有关将计时器用作可调用函数的示例,请参见答案中的编辑。
  • 你是最好的 Billiant,干得好,令人印象深刻
  • 如何关闭?我的意思是我对它很满意并想关闭
  • 如果 iok 我可以问一下如何添加到批处理中,例如按 Enter 或任何内容,如果在超时之前尽早完成,请立即重新启动
【解决方案2】:

PsShutdown

您可以使用 Mark Rusinovich 的 psshutdown,这正是您想要的:

  • 在指定时间后启动关机
  • 显示倒计时
  • 允许用户使用 cancel 按钮取消

免费使用。

命令行:psshutdown -k -f -t 30 -c

  • -k 关闭计算机(ACPI 关机)
  • -f 强制程序在必要时终止
  • -t 30 在关机前引入了 30 秒的延迟
  • -c 允许用户使用 Cancel 按钮取消关机

(截图来自superuser.com

选择

另一种选择是多次致电choice /t 1

@echo off

set /a "t=30"
:loop
set /a "t-=1"
if "%t%" == "0" goto timedout
cls
choice /T 1 /C sc /N /D s /M "Shutdown in %t% seconds, press c to cancel: "
if not "%errorlevel%" == "1" goto cancelled 
goto loop

:cancelled
echo You cancelled shutdown
pause
goto :eof

:timedout
echo Shutting down
shutdown /s /f /t 1
pause
goto :eof
  • set /a "t=30" 将变量 t 设置为 30
  • set /a "t-=1"t 中减去 1
  • t 达到零时,if "%t%" == "0" goto timedout 启动关机
  • cls 清除屏幕上的先前文本
  • choicetimeout 知道它是否被取消但没有打印时间
    • /T 1 - 1 秒后超时(更新消息)
    • /C sc - 选项 1 是 s,选项 2 是 c
    • /N - 最后不要显示[s,c]
    • /D s - 1 秒超时的默认选项是 s
    • /M "Shutdown in %t% ..." - 显示带有变量 t 的当前值的消息

请注意,shutdown /s /f /t NNN 在没有时间的情况下可能与shutdown /s /f 的行为不同,因此我将/t 1 包括在内以防万一。

关机/a

在倒计时之前实际启动关机可能是有利的,但允许用户中止它:

  • 按照上一节(“选择”)中的说明进行倒计时。

    • 您可以只用简单的timeout 命令多花几秒钟,希望批处理脚本在时间用完之前被关闭中止,但这会非常混乱和不可靠,因此不推荐这样做李>
  • 开始倒计时之前 (:loop) 像这样开始关机: shutdown /s /f /t 30

  • 如果超时,什么也不做(删除timedout:之后的shutdown /s /f /t 1

  • 如果用户取消了(在:cancelled 之后),使用:shutdown /a 中止它

【讨论】:

  • @Alis - 第二个选项(使用choice)完全符合您的要求。
  • 哦,哎呀,对不起,最后一部分已修复以指示也使用choice 部分。 PsShutdown 还在其自己的窗口中显示倒计时(它取代了正常的you are about to be signed out 窗口),并允许在其窗口中使用按钮取消它。
  • 还为 psshutdown 添加了正确的命令行,并从 superuser.com 复制了屏幕截图 - 第一次回答时忘记这样做了,抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2014-02-28
相关资源
最近更新 更多