预定关机前还剩时间?

Bob*_*Bob 9 shutdown windows-7

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

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

shutdown /t 600 /s
Run Code Online (Sandbox Code Playgroud)

那会弹出一个消息框,说距离关机还有 10 分钟,以及关机的实际系统时间。

任何超过600秒的时间都使用气球消息。

我依稀记得 XP 提供了一个 GUI 进度监视器,带有倒计时。

他们是如何工作的?剩余的关机时间或预定时间必须存储在某处,我如何访问它?

我的偏好是通过命令行的一些方法(即非 GUI)。更重要的是,这是否可以在 Windows 中完成,即无需任何第三方程序?

如果使用标准的 Windows 实用程序无法实现这一点(我在这里接近 Stack Overflow 领域),是否有 Windows API(或 .NET,甚至可以在 PowerShell 中使用!)功能?任何一个都比一些随机的第三方程序更受欢迎。

Sam*_*org 6

问题很有趣,所以我编写了可以为您完成工作的批处理

基本上它是倒数计时器,我没有包含shutdown对此的命令,而是将其作为作业。计算不准确,这不关心闰年,月份的长度,......这主要是为了可读性,因为我想让它易于学习。

目前有两个文件一起做工作,一个启动计时器,另一个在调用时告诉计时器启动经过了多长时间。这两个文件可以很容易地组合成一个 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
Run Code Online (Sandbox Code Playgroud)

符合以下开头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 时间。如果您需要准确,请参阅谷歌)。

然后最后一行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
Run Code Online (Sandbox Code Playgroud)

这里的代码流从上到下不是线性的。首先我们GOTO CHECKFILE标记以便执行命令真正开始于说:CHECKFILE. 这里的很多东西都和 with 一样,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"
Run Code Online (Sandbox Code Playgroud)

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

说到这里,都忘记了。这里的这个批处理文件是独立工作的,所以没有单独的StartTimer.cmdGetTimerValue.cmd只有这个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
Run Code Online (Sandbox Code Playgroud)

shutdown或任何其他命令集成:

文件poweroff.cmd

@ECHO OFF
Timer start %1
shutdown -t %1 -s
Run Code Online (Sandbox Code Playgroud)

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

  • @Bob - 你回来后打算发布关于你的程序的信息吗?链接到exe/源代码? (2认同)