计划关闭前还剩时间吗?


8

有什么方法可以查看在Windows 7中计划关闭之前还剩下多少时间?

调度关闭是指使用命令行shutdown.exe应用程序调度的关闭(或重新启动),例如:

shutdown /t 600 /s

那会弹出一个消息框,提示关闭前还有10分钟,以及实际的关闭系统时间。

超过600几秒钟的任何时间都将使用气球消息代替。

我隐约记得XP提供了一个带有倒计时的GUI进度监视器。

他们是如何工作的?必须将剩余的关机时间或计划的时间存储在某个地方,如何访问此时间?

我更喜欢通过命令行使用的某种方法(即非GUI)。更重要的是,这在Windows中是否可以完成,即没有任何第三方程序?

如果使用标准Windows实用程序无法做到这一点(并且我在此处要进入Stack Overflow领域),是否有Windows API(或.NET,甚至可以在PowerShell中使用!)功能?两者都比某些随机的第三方程序更受青睐。


superuser.com/a/317062/117590看起来很有希望,但是,最好/要求不像添加注释(/c <time>)一样修改shutdown命令。
鲍勃

我认为批处理文件将不难编写。提示输入时间,每隔5分钟左右,它就会响应一次,即IE“剩余10分钟”。当计数到1时,请递减计数秒之类的东西。
cutrightjm 2012年

我不需要倒数计时,我需要一些方法来获取<this>时刻的剩余时间。外部程序正在调用关闭命令。
鲍勃

Answers:


5

问题很有趣,所以我写了一批可以为您做的工作。

基本上它是倒数计时器,我没有shutdown为此添加命令,但将其留作家庭作业。计算不准确,这并不关心leap年,月份的长度……主要是为了提高可读性,因为我想让它易于学习。

当前有两个文件一起工作,一个启动计时器,另一个启动计时器,它告诉您从计时器启动起经过了多少时间。这两个文件可以很容易地组合到一个cmd脚本中,这样您就可以使某些行可重用(如定义的方法)。

好吧,让我们看一下脚本,

这里是StartTimer.cmd

@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
  SET DateD=%%a
  SET TimeH=%%b
  SET TimeM=%%c
  SET DateM=%%d
  SET TimeS=%%e
  SET DateY=%%f
)
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
ECHO %EPOCH% > Timer.start.state

以以下内容开头FOR /F "skip=1 ...
1.询问wmic当前时间和日期。
2.将输出的第一行(标题)跳过skip=1
3.通过使用由分隔的tokens=1-6含义读取值。4.存储值的变量,... ,...%%a-%%fSpaceorTAB
%DateY%%TimeH%%TimeM%

在此行的开头,SET /A EPOCH=...我们使用表达式来计算经过的秒数1.1.1970这是简单的近似值,不是真正的unix时间。如果需要准确的信息,请参阅Google)。

然后最后一行ECHO %EPOCH% > ...将计算出的时间写入名为“ Timer.start.state”的文件。

在这里GetTimerValue.cmd

@ECHO OFF

GOTO CHECKFILE

:TIMEOUT
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /P Timer=<"Timer.start.state"
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
SET /A Elapsed=%EPOCH%-%Timer%
ECHO "Seconds since timer started: %Elapsed%"
GOTO EOF

:CHECKFILE
IF EXIST "Timer.start.state" (
  GOTO TIMEOUT
) ELSE (
  ECHO "Timer not started. Start timer by running Timer.cmd"
)

:EOF

在这里,代码流从上到下不是线性的。首先,我们将GOTO CHECKFILE标签标记为执行命令实际上始于:CHECKFILE。这里的很多事情都与之相同,StartTimer.cmd因此我只解释新的或更改的行。

首先,我们检查状态文件是否Timer.start.state存在,如果不存在,则终止机智消息。如果计时器已启动并且文件存在,则我们继续进行一些数学运算:
1.跳至:TIMEOUT输出经过的秒数的位置。您可以为此选择更好的标签...
2. SET /P %Timer% ...从文件中读取开始时间,并将值分配给%Timer%变量。
3. SET /A Elapsed ...计算从开始时间到现在的秒数。
4. ECHO "Seconds ...回显计算出的值(自计时器启动以来的秒数)。

如何获得剩余时间:

您可以。减去%Elapsed%来自%MaxTime%

@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"

好的,解释够了。这是完整的脚本Timer.cmd

至此,忘记了已经说过的一切。这里的批处理文件是单独工作的,因此没有单独的StartTimer.cmdGetTimerValue.cmd只有this的Timer.cmd。基本上还是一样,但是代码流不同,用法也完全不同。但是,这不会将状态保存到文件,因此,如果您需要上面的使用示例将状态保存到文件/从文件中读取,则注销/重新引导后就无法再获取计时器值。

Timer.cmd当不带参数运行时,将打印用法/帮助。我尚未对此进行完整的测试,并且可能存在一些错别字等,args并非经过严格的检查。

@ECHO OFF

GOTO TimerUser%1

:: ===================================
:: Operation is start, (re)start timer
:: ===================================
:TimerUserstart
ECHO %2 | FINDSTR /R "^[1-9]"
IF %ERRORLEVEL%==0 (
  SET Timer.max=%2
  GOTO TimerStart
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   You must specify maximum value.
  ECHO   ===============================
  GOTO TimerUser
)

:: =============================================
:: Operation is get, get values if timer running
:: =============================================
:TimerUserget
IF DEFINED Timer.start.state (
  GOTO TIMEOUT
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   Timer is not started, start timer first.
  ECHO   ========================================
  GOTO TimerUser
)

:: ============
:: Usage / Help
:: ============
:TimerUser
  ECHO.
  ECHO Timer.cmd Usage: Timer.cmd operation [options]
  ECHO.
  ECHO - Operations
  ECHO   start    Start new timer, n must be specified.
  ECHO   get      Get current value of started timer.
  ECHO.
  ECHO - Options:
  ECHO   n        Max value in seconds, used to calculate remaining time.
  ECHO.
GOTO EOF

:: =============================
:: Update %Timer.epoch% variable
:: =============================
:TimerUpdateEpoch
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /A Timer.epoch=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
GOTO %Timer.Callback%

:: ===========================================
:: Start new timer destoying/resetting old one
:: ===========================================
:TimerStart
SET Timer.Callback=TimerStartC1
GOTO TimerUpdateEpoch
:TimerStartC1
SET Timer.start.state=%Timer.epoch%
GOTO EOF

:: =============================
:: Echo out current timer values
:: =============================
:TIMEOUT
SET Timer.Callback=TimerEchoJ1
GOTO TimerUpdateEpoch
:TimerEchoJ1
SET /A Timer.elapsed=%Timer.epoch%-%Timer.start.state%
SET /A Timer.remaining=%Timer.max%-%Timer.elapsed%
ECHO "Seconds since timer started: %Timer.elapsed% Time remaining %Timer.remaining%"
GOTO EOF

:EOF

shutdown或任何其他命令集成:

档案poweroff.cmd

@ECHO OFF
Timer start %1
shutdown -t %1 -s

用法:poweroff <wait_seconds>启动定时关机并Timer get获取已用时间/剩余时间。


我为您的努力表示赞赏。我刚刚意识到问题的措辞多么糟糕,但是您仍然设法回答了这个问题。为此,您将获得支持。不幸的是,这不适用于任意的关机命令,即StartTimer.cmd必须显式调用。我已经编写了一个小程序来解决我的问题,当我回到计算机时会发布该程序。
鲍勃

好吧,我会接受的。我最后写的是被命名为C#程序shutdown.exe,即要求shutdown_original.exe。它将检查/t标志,如果存在,则创建一个保存了开始时间和结束时间的文件。在获取时间(/retrieve标志)时,它将检查事件日志以查看自计时器启动以来是否执行了启动或中止操作。我不确定它将如何处理休眠状态。我不打算发布代码或程序:这是一辆越野车。为了使该程序正常运行,我不得不在安全设置上做很多事情,我不想推广这些设置。
鲍勃

基本概念是拦截shutdown.exe呼叫并将时间记录到文件中,这就是您所做的事情,也是我接受这一点的原因。
鲍勃

2
@Bob-您打算回来时发布有关程序的信息吗?链接到exe /源代码?
Alex S
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.