シャットダウン予定までの残り時間は?


8

Windows 7でスケジュールされたシャットダウンまでの残り時間を確認する方法はありますか?

スケジュールされたシャットダウンとは、コマンドラインshutdown.exeアプリケーションを使用してスケジュールされたシャットダウン(または再起動)を意味します。例:

shutdown /t 600 /s

これにより、シャットダウンまで10分あり、シャットダウンの実際のシステム時間を通知するメッセージボックスが表示されます。

600秒より長い時間は、代わりにバルーンメッセージを使用します。

ぼんやりと、カウントダウン付きのGUI進行状況モニターを提供するXPを思い出します。

彼らはどのように機能しましたか?シャットダウンの残り時間またはスケジュールされた時間はどこかに保存する必要があります。これにアクセスするにはどうすればよいですか?

私の好みは、コマンドライン(つまり、非GUI)を使用する方法です。さらに重要なことに、これはWindows内で、つまりサードパーティのプログラムなしで実現できますか?

これが標準のWindowsユーティリティで達成できない場合(そしてここではStack Overflowの領域に接している)、Windows API(または.NET、PowerShellでも使用できる!)関数はありますか?どちらかは、ランダムなサードパーティのプログラムよりも優先されます。


superuser.com/a/317062/117590は有望に見えましたが、コメント(/c <time>)を追加する場合と同じように、shutdownコマンドを変更しないことをお勧めします。
ボブ

バッチファイルを書くのは難しくないと思います。時間の入力を求めるプロンプトが表示され、5分ごとにIEが「残り10分」という時間で応答する可能性があります。1になったらカウントダウンします。秒か何か。
cutrightjm 2012

カウントダウンは必要ありません。<this>の残り時間を取得する方法が必要です。シャットダウンコマンドが外部プログラムによって呼び出されています。
ボブ

回答:


5

質問が面白かったので、あなたのために仕事ができるバッチを書きました

基本的にはカウントダウンタイマーですが、shutdownこれへのコマンドは含まれていませんでしたが宿題のままにしておきました。計算は正確ではありません。うるう年や月の長さは問題になりません。これは主に読みやすくするためです。簡単に習得したいと考えていたからです。

現在、2つのファイルが一緒にジョブを実行しています。1つはタイマーを開始し、もう1つは呼び出されたときにタイマーの開始からの経過時間を示します。これら2つのファイルはかなり簡単に1つの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%%a-%%f区切られSpaceorTABた意味を使用して値を読み取ります。
4.変数に格納値%DateY%、... %TimeH%%TimeM%、...

その後、行頭で経過秒数SET /A EPOCH=...を計算する式を使用します(これは単純な概算であり、実際のUNIX時間ではありません。正確が必要な場合はGoogleを参照してください)。1.1.1970

次に、最後の行で、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が存在するかどうかを確認し、存在しない場合はwitメッセージを終了します。タイマーが開始され、ファイルが存在する場合は、続行していくつかの計算を行い
ます。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が、これだけTimer.cmd。基本的には同じですが、コードフローが異なり、使用方法もまったく異なります。ただし、これは状態をファイルに保存しないため、上記の使用例を使用してファイルに状態を保存/読み取る必要がある場合は、ログオフ/再起動後にタイマー値を取得できなくなります。

の使用法/ヘルプは、Timer.cmd引数なしで実行すると出力されます。私はこれを完全にテストしていませんし、いくつかのタイプミスなどがあるかもしれません、引数は絶対にチェックされていません。

@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。つまり、明示的に呼び出す必要があります。私は自分の問題を解決するための小さなプログラムを書いており、コンピューターに戻ったらそれを投稿します。
ボブ

承知しました。これを受け入れます。結局shutdown.exe、という名前のC#プログラムを作成してしまいましたshutdown_original.exe/tフラグをチェックし、存在する場合は、開始時刻と終了時刻を保存したファイルを作成します。時間(/retrieveフラグ)を取得すると、イベントログをチェックして、タイマーが開始してから起動または中止が実行されたかどうかを確認します。それが冬眠をどのように処理したかはわかりません。コードやプログラムを投稿するつもりはありません。バグの多い混乱です。そして、プログラムを機能させるには、宣伝したくないセキュリティ設定をいじくり回さなければなりませんでした。
ボブ

基本的なコンセプトは、shutdown.exe通話を傍受し、時間をファイルに記録することでした。これが、あなたがしたことであり、私がこれを受け入れる理由です。
ボブ

2
@ボブ-あなたが戻ったときにあなたのプログラムについて投稿するつもりでしたか?exe /ソースコードへのリンク?
Alex S
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.