👻
Windows のバッチファイルで使えるコマンドの備忘録
バッチファイルで使えるコマンドなどの備忘録です。
バッチファイルに書いたコマンドを復唱させないようにする
@echo off
変数の範囲を限定する
set foo=bar
setlocal
set foo=buzz
echo %foo%
buzz
endlocal
echo %foo%
bar
遅延環境変数
REM if/forブロックで変数を変更した場合にも正しく値が取得できるようにする
setlocal enabledelayedexpansion
拡張機能有効
setlocal enableextensions
カレントディレクトリパス
%~dp0
コマンドの結果を取得
copy nul hoge.txt
echo %ERRORLEVEL%
ERRORLEVELを返さないコマンドのエラー判定
DELコマンドは、エラーになってもERRORLEVELを返しません。
その代わりに標準エラーにメッセージが出ますので、メッセージ有無で判定します。
DEL A 2>&1 | FIND /V ""
ERRORLEVELは、エラーがあれば、0(FIND結果がある)、なければ、1(FIND結果がない)
日付のフォルダを作る
echo %date%
2000/12/31
mkdir %date:/=%
20001231
または、個別に年月日部分を切り出す
mkdir %date:~0,4%%date:~5,2%%date:~8,2%
20001231
日時のフォルダを作る
echo %time%
12:34:56.99
or
2:34:56.99
set now=%time: =0%
mkdir %date:/=%%now:~0,2%%now:~3,2%%now:~6,2%
20001231123456
0バイトファイルを作る
type nul > hogehoge.txt
copy nul foobar.txt
ファイルを世代で消す
REM 31世代でファイルを消します
FOR /f "usebackq skip=31" %%F in (`dir /b /o-n`) do (del %%F >NUL 2>&1)
入力を待機する
set /p input=入力してください:
if /i "%input%" == "" (goto aaa)
if /i "%input%" == "99" (goto bbb)
if /i "%input%" == "1" (goto xxx)
if /i "%input%" == "2" (goto yyy)
if /i "%input%" == "3" (goto zzz)
指定したキーの入力を受け付ける
REM CHOICE と記述しただけでY,Nのみ受け付けます
REM %ERRORLEVEL%を取得すると、Yのとき1, Nのとき2となります
CHOICE
[Y,N]?
REM キーを指定する
REM %ERRORLEVEL%を取得すると、Yのとき1, Nのとき2となります
CHOICE /C:YN /M:"実行してもよろしいですか?"
実行してもよろしいですか? [Y,N]?
REM キーを指定する
REM %ERRORLEVEL%を取得すると、Aのとき1, Bのとき2、Cのとき3となります
CHOICE /C:ABC /M:"選択してください"
選択してください [A,B,C]?
REM 選択肢を非表示にする
CHOICE /N /C:YN /M:"実行してもよろしいですか?(Y/N)"
実行してもよろしいですか?(Y/N)
一定時間指定したキーの入力を受け付ける
REM /D で一定時間経過したときのデフォルトの選択肢を指定できます
SET WAIT_COUNT=5
CHOICE /N /C:YN /T:%WAIT_COUNT% /D:Y /M:"実行してもよろしいですか?(Y/N)"
長いコマンドを複数行に記載する
net share 共有名=共有ディレクトリパス^
/REMARK:"共有ディレクトリです。"^
/UNLIMITED^
/grant:グループ名1,full^
/grant:グループ名2,read^
指定した時間のみ実行する
@echo off
set start=0900
set end=1659
set now=%time: =0%
set nowstr=%now:~0,2%%now:~3,2%
echo %nowstr%
if 1%nowstr% LSS 1%start% goto err
if 1%end% LSS 1%nowstr% goto err
echo この時間は動作OKです。
goto end
:err
echo 時間外です
:end
ファイルの存在をチェックする
if exist "path\to\filename" (
REM ファイルが存在する場合
) else (
REM ファイルが存在しない場合
)
n分後の時刻を求める
REM n分後の時刻を求める
REM 引数で指定して画面に時刻(HH:MM)を表示する。
REM 引数がないときは30分後とする。
REM 現在時刻の取得/
for /F "tokens=1,2 delims=:" %%i in ('time /t') do set h=%%i && set m=%%j
set add=30
if not "%1"=="" set add=%1
REM 先頭の0を取り除く
if %h% LSS 10 set h=%h:~1,1%
if %m% LSS 10 set m=%m:~1,1%
REM %add%分後の計算
set /a totalm=h*60+m
set /a totalm=totalm+%add%
REM 時の編集
set /a h=totalm/60
if %h% GEQ 24 set /a h=h-24
if %h% LSS 10 set h=0%h%
REM 分の編集
set /a m=totalm%%60
if %m% LSS 10 set m=0%m%
echo %h%:%m%
Discussion