8

そのため、set コマンドの下の if ステートメントの 1 つにタイマーを追加しようとしていますが、コマンドが何であるかわかりません。スクリプトが起動し、30 分待ってから PC を再起動するか、ユーザーの入力を待ってその時点で入力するか、キャンセルします。そのため、「今すぐ再起動」と「キャンセル」の 2 つの if ステートメントが設定されていますが、再起動コマンドを実行する 30 分前からカウントダウンする if ステートメントが必要です。また、残り時間を示す視覚的なタイマーを追加する方法を誰かが知っていれば、それはプラスになります。みんなありがとう!!!

@Echo off

:START

set /p answer=PC WILL RESTART IN 30 MINUTES, PRESS N TO RESTART NOW OR C TO CANCEL

if "%answer%"=="n" (GOTO Label1)
if "%answer%"=="c" (GOTO Label2)
if "TIMER GOES HERE" "==" (GOTO Label1)

:Label1

shutdown -r -t 60 -f

:Label2 

exit
4

5 に答える 5

11

を使用することをお勧めしCHOICE.EXEます。Windows のほとんどのバージョンに標準で付属しています (Windows NT、2000、および XP を除いて、以前は Microsoft の Web サイトからダウンロードできましたが、ftp サイトで *これを見落としていたようです)。使い方は簡単。

@Echo off
:START
set waitMins=30

echo PC WILL RESTART IN %waitMins% MINUTES: Press N to restart [N]ow or C to [C]ancel
:: Calculate Seconds
set /a waitMins=waitMins*60
:: Choices are n and c, default choice is n, timeout = 1800 seconds
choice /c nc /d n /t %waitMins%

:: [N]ow = 1; [C]ancel = 2
goto Label%errorlevel%

:Label1

shutdown -r -t 60 -f
:: Make sure that the process doesn't fall through to Lable2
goto :eof

:Label2 
exit

単にCHOICE.EXEこのように動作します...

choice

...と同じです...

choice /c yn

...両方とも表示されます...

[Y,N]?

Y...両方とも、ユーザーが aまたはを押すのを待ちますN

Choice は結果を %errorlevel% に格納します。Y=1、N=2。

私が提供したコードは、デフォルト/D <choice>とタイムアウト/T <seconds>のオプションを利用しています。

例では...

choice /c yn /d y /t 5

...ユーザーに Y または N の選択肢を与え、5 秒間待ってから、デフォルトの Y を自動的に選択し、%ERRORLEVEL%==1 になります。

別の例は...

choice /c abcdef /m "Make a choice. "

...そして表示されます...

Make a choice. [A,B,C,D,E,F]? 

...と...

A = %ERRORLEVEL% = 1
B = %ERRORLEVEL% = 2
C = %ERRORLEVEL% = 3
D = %ERRORLEVEL% = 4
E = %ERRORLEVEL% = 5
F = %ERRORLEVEL% = 6

ERRORLEVEL 0 はありません。

の使用方法の詳細については、コマンド プロンプトで入力してくださいchoiceCHOICE /?


*: リンクを提供するバージョンのCHOICE.EXEI は、わずかに異なるコマンドを使用しますが、同じ機能を提供します。

于 2012-09-08T20:38:04.670 に答える
8

休止状態の同様のもの。

@echo off
setlocal enableDelayedExpansion
for /l %%N in (600 -1 1) do (
  set /a "min=%%N/60, sec=%%N%%60, n-=1"
  if !sec! lss 10 set sec=0!sec!
  cls
  choice /c:CN1 /n /m "HIBERNATE in !min!:!sec! - Press N to hibernate Now, or C to Cancel. " /t:1 /d:1
  if not errorlevel 3 goto :break
)
cls
echo HIBERNATE in 0:00 - Press N to hibernate Now, or C to Cancel.
:break
if errorlevel 2 (%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState Hibernate) else echo Hibernate Canceled
于 2012-10-08T19:06:02.210 に答える
2

これは、タイムアウト機能を提供するが視覚的なカウントダウンを提供しない、Vista および Windows 7 用の非常に単純なソリューションです。

@echo off
choice /c:CN /n /m "PC will restart in 30 minutes. Press N to restart Now, or C to Cancel" /t:1800 /d:N
if errorlevel 2 (shutdown -r -t 60 -f) else echo Restart Canceled

これは、視覚的なカウントダウンを提供する Vista および Windows 7 向けのより複雑なソリューションですが、1 秒ごとにコンソール ウィンドウがクリアされます。また、タイミングが少しずれている可能性があります。

@echo off
setlocal enableDelayedExpansion
for /l %%N in (1800 -1 1) do (
  set /a "min=%%N/60, sec=%%N%%60, n-=1"
  if !sec! lss 10 set sec=0!sec!
  cls
  choice /c:CN1 /n /m "PC will restart in !min!:!sec! - Press N to restart Now, or C to Cancel. " /t:1 /d:1
  if not errorlevel 3 goto :break
)
cls
echo PC will restart in 0:00 - Press N to restart Now, or C to Cancel.
:break
if errorlevel 2 (shutdown -r -t 60 -f) else echo Restart Canceled

XP ソリューションが必要な場合は、タイムアウト機能で入力を求める非ネイティブ コマンド ライン ツールをダウンロードするか、VBScript または JScript に切り替える必要があると思います。

編集

上記の両方のスクリプトは、James K が回答で提供した Microsoft FTP サイトからダウンロードした CHOICE.EXEを使用して、XP で実行するように適合させることができます。

そのバージョンの CHOICE は、構文が少し異なります。

私の最初のスクリプトを適応させるには、次を使用します。

choice /c:CN /n /t:N,1800 "PC will restart in 30 minutes. Press N to restart Now, or C to Cancel"

2 番目のスクリプトを適応させるには、次を使用します。

choice /c:CN1 /n /t:1,1 "PC will restart in !min!:!sec! - Press N to restart Now, or C to Cancel. "


編集 - XPと互換性のある大まかなVBSソリューションは次のとおりです

Set objShell = CreateObject("WScript.Shell")
for i = 30 to 1 step -1
  if i=1 then unit=" minute" else unit=" minutes"
  rtn = objShell.Popup ( _
    "The machine would like to Restart."&VbCrLf&VbCrLf& _
    "Click OK to restart now"&VbCrLf& _
    "Click Cancel or the [X] close button to abort the restart"&VbCrLf& _
    "Do nothing and the machine will restart in "&i&unit, _
    60, "Restart in "&i&unit, 1+48 _
  )
  if rtn <> -1 then exit for
next
if rtn <> 2 then objShell.Run "shutdown -r -f"

HTA を使用すると、より洗練された VBS ソリューションを提供できると思いますが、それにはさらに多くの作業が必要であり、そのテクノロジについてはあまり知りません。

于 2012-09-08T17:43:05.873 に答える
0

ただし、SPC_75 によるこのスクリプトは .vbs ファイルであり、休止状態にはお勧めしますが、スリープまたはシャットダウン用に変更するのは簡単です。

'//*******************************************
'//hibernate.vbs
'//Purpose: Count Down to action (Hibernate)
'//Tested on Server 2008, Win 7 64bit, and XP
'//Author: SPC_75 
'//Revision 1.3
'//Date: 1/09/2011
'//*******************************************

Option Explicit
Dim timeout, objShell, intReturn
Const wshOk = 1
Const wshOkDialog = 0
'Const wshIcon = 16 '/critical
'Const wshIcon = 32 '/question
Const wshIcon = 48 '/exclamation
'Const wshIcon = 64 '/information

timeout = 30 '/Timeout in seconds

Set objShell = CreateObject("Wscript.Shell")
  Do Until timeout = 0
    timeout = timeout - 1
    intReturn = objShell.Popup(vbCrlf &"Hibernation about to initiate. Abort?"&vbCrlf & vbCrlf & vbCrlf & vbCrlf & "Time until hibernation : " & timeout, 1, "Hibernation", wshOkDialog + wshIcon + 4096)
    If intReturn = wshOk Then
        Wscript.Quit
    End If
  loop
  objShell.Run "powercfg /hibernate on"
  objShell.Run "shutdown -h"
  objShell.Run "rundll32 powrprof.dll,SetSuspendState Hibernate"  '/XP specific Hibernation command
set objShell = nothing

'//EOF

警告とタイムアウトで完全に機能します。

于 2016-09-13T04:10:21.673 に答える
0

このコードを使用して、指定したミリ秒数だけスクリプトを一時停止します。

PING 1.1.1.1 -n 1 -w <milliseconds> >NUL 

1.1.1.1これにより、経過後に IP アドレスに 1 つの ping が送信されます<milliseconds>。そして、pingコマンドの出力は NUL に却下されます。

于 2012-09-08T14:12:23.017 に答える