👻

Windows のバッチファイルで使えるコマンドの備忘録

2022/12/09に公開

バッチファイルで使えるコマンドなどの備忘録です。

バッチファイルに書いたコマンドを復唱させないようにする

@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