質問が面白かったので、あなたのために仕事ができるバッチを書きました。
基本的にはカウントダウンタイマーですが、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
区切られSpaceor
TABた意味を使用して値を読み取ります。
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.cmd
かGetTimerValue.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
し、経過/残り時間を取得する。
/c <time>
)を追加する場合と同じように、shutdownコマンドを変更しないことをお勧めします。