10

一連のパッチを実行する cmd スクリプトがあり、パッチの問題を回避するために再起動が必要な場合は中止するように設計されています。また、可能であればパッチの途中での再起動を回避するために、再起動がスケジュールされている場合 (たとえば、「shutdown」コマンドを介して) 中止するようにスクリプトを拡張したいと考えています。残念ながら、別のシャットダウンをスケジュールする以外に、これを検出する方法を見つけることができませんでした。その結果、次のようになります。

システムのシャットダウンは既にスケジュールされています。(1190)

理論的にはこれを使用できますが、スケジュールされた再起動を確認する必要があるたびに、ログインしているユーザーを怖がらせるのは良い習慣ではないと思います. 私が本当に必要としているのは、「シャットダウン」コマンドによって変更された状態を照会する方法です。

これは可能ですか?シャットダウンイベントをキャッチするためにシステム上でアプリケーションを永続的に実行する必要のないソリューションに本当に満足しています(シャットダウンが実際にトリガーされるまで送信されることさえないと思います)

4

5 に答える 5

4

私は同じ問題を抱えています。私はあちこち検索しましたが、役に立つものは何も見つかりませんでした。

最終的に、私は考えられるさまざまなことをいじり始めました。この問題の回避策は 2 つあります。

イベント ビューアーは、シャットダウンがスケジュールされたことを通知できますが、スケジュールされた時刻は通知しません。

1 つの考えとしては、イベント ビューアに、最新のシステム シャットダウン、スケジュールされたシャットダウン、およびスケジュールされたシャットダウンの最新のキャンセルを照会することです。スケジュールされたシャットダウンが、最新のキャンセルまたはシャットダウンよりも新しい場合、進行中のシャットダウンがあります。イベント ID は次のとおりです。開始されたスケジュールされたシャットダウンの場合は 1074、キャンセルされたスケジュールされたシャットダウンの場合は 1075、Windows ログ/システムでは 12 システムの起動では 13 システムのシャットダウンでは (すべて Windows ログ/システムの下)

私はバッチファイルでこれを行うのが面倒でしたが、それが可能であることは知っています.

それで、これが私がやったことです。シャットダウンをスケジュールするのではなく、中止してみてください。シャットダウンが進行中でない場合、エラーがスローされます (シャットダウンが進行中でないため、システムのシャットダウンを中止できません (1116))。シャットダウンをスケジュールしてユーザーを驚かせるよりはずっといいと思います。

これは、単純な自動シャットダウン スクリプト用に書いたコードのコピーです。スケジュールされたシャットダウンのキャンセルと開始を切り替えます。

@echo off
shutdown /a
if errorlevel 1 call:shutdown
goto end

:shutdown
    set /p choice=Shutdown in how many minutes? 
    set /a mod=60
    set /a mod*=%choice%
    shutdown /s /t %mod%

:end

編集- 追加する情報があるため、この回答を再検討しています。

上記のソリューションは、shutdown.exe コマンドで /t 引数を使用してシャットダウンがスケジュールされているかどうかを検出します。

Windows がシャットダウンをスケジュールしているかどうかを判断する必要がある場合 (いくつかの Windows Update の後に自動的にシャットダウンするため)、照会できるレジストリ エントリが設定されています。以下は PowerShell の場合ですが、バッチ ファイルを記述して同じことを行うことができます。

Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'

注: shutdown.exe を使用してスケジュールされた再起動の場合、これは true を返しません。Windows がコンピューターを再起動する必要があると通知した場合にのみ true を返します。

于 2013-01-23T08:06:51.153 に答える
0

おそらく、長い猶予期間でExitWindowsExを呼び出してシャットダウンを開始し、戻りコードERROR_SHUTDOWN_IS_SCHEDULEDを確認し、ExitWindosExが成功を返した場合はすぐにAbortSystemShutdownを呼び出すことができます(シャットダウンが正常にスケジュールされたことを示します)。

于 2011-05-27T20:06:38.313 に答える
0

タスク スケジューラ APIを使用して、スケジュールされたタスクを列挙し、それらのいずれかが shutdown.exe を呼び出すかどうかを確認できると思います。しかし、それが堅牢かどうかはわかりません。シャットダウンをスケジュールする方法はおそらく複数あります。

于 2011-05-27T20:02:28.000 に答える
0

スクリプトがシャットダウンを設定している場合、これを行う別の方法は、setx コマンドを使用して %date% および %time% 変数をグローバル環境に保存することです。次にスクリプトが呼び出されたときに、これらの変数を確認できます。

于 2015-02-23T12:59:29.880 に答える