Windowsバッチファイル (bat) のメモ
自分用。適当に追記。
基本
- 文字コードは Shift_JIS にすること。
- 改行コードは CR+LF ……と思いきや、LFだけでも大丈夫な感じがする。
勝手にコマンドプロンプト閉じさせない
pause
最後に pause
を書くと、キー入力があるまでは閉じないでくれる。
結果を画面に表示するようなプログラムを実行するとき、結果を確認するのによく使う。
echo www
pause
cmd.exe /K
最後に cmd.exe /K
を書くと、コマンドプロンプトが開いたままになり、続けて操作できる。
echo www
cmd.exe /K
例えば以下は PATH
に追記してコマンドプロンプトを開いたままにするだけのスクリプト。
set PATH=C:\path\to\something;%PATH%
cmd.exe /K
コマンドプロンプトにコマンド表示させない
先頭に @echo off
と書く。
@echo off
echo www
pause
bat自身のファイルパス・ディレクトリを取得する
%\
dpn0 でファイルパスを、
%`dp0` でディレクトリを取得できる。
batファイル自身が C:\path\to\me.bat
の場合…
@echo off
echo %~dpn0
echo %~dp0
pause
C:\path\to\me
C:\path\to\
カレントディレクトリをバッチファイルのディレクトリにする - 強火で進め
batから別のbatを実行する
start other.bat [引数1] [引数2] ...
call other.bat [引数1] [引数2] ...
pauseの「続行するには何かキーを押してください」を表示させない
pause >nul
ファイルに出力する
echo ahaha > a.txt
echo ahaha >> a.txt
call hogehoge >> log 2>&1
変数を使う
set {変数名}={値}
で値をセットする。使うときは %{変数名}%
と書くと使える。
値にスペースが入ってたりしても、特にクォートとかはしなくて平気。
@echo off
set aaa=www ww
echo %aaa%
pause
www ww
PATHに追記する
set
で PATH
の現在値に追加したいパスを結合してセットする。
set PATH=C:\path\to\something;%PATH%
現在日時をYYYYMMDDhhmmssで取得
[現在時刻をYYYYMMDDHHMMSS形式で取得する - Qiita] : バヤシタ](https://qiita.com/ejiw/items/2a17a2f8cbf0588369da)
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
echo %now%
20200721095446
ファイルが存在したら消す
exist
でファイル・フォルダの存在チェックできる。del
でファイルを消せる。
set filaname=myfile.txt
if exist %filaname% (
del %filaname%
)
フォルダが存在したら消す
exist
でファイル・フォルダの存在チェックできる。rmdir
でフォルダを消せる。
rmdir
に /S
フラグを指定すると、フォルダの中身のファイルやサブフォルダごと全部消せる。/Q
フラグを指定すると、削除の確認をスキップできる。
set foldername=myfolder
if exist %foldername% (
rmdir %foldername% /S/Q
)
ファイルを上書きコピーする
copy
に /Y
フラグを指定すると、ファイルが存在してても確認せずに上書きする。
copy aaa.txt bbb.txt /Y
ファイル・フォルダをそのままコピーする
xcopy
で元の構造をそのままにコピーできる。
/I
フラグを指定すると、コピー先のフォルダが存在しない場合に自動で作成してくれる。
/H
フラグを指定すると、隠しファイルも完全にコピーする。
/E
フラグを指定すると、コピー先に無いサブフォルダもコピーする。
/Y
フラグを指定すると、ファイルが存在してても確認せずに上書きする。
xcopy aaa bbb /I/H/E/Y
コマンドプロンプト xcopy - [ファイルをディレクトリ構造ごとコピーする]
npmコマンドを使う
call
で呼ばないと途中で終了してしまう。
call npm run build
call npx mocha tests\hogehoge.js
例
batファイルの場所にcdする
cd /d %~dp0
ファイルが存在しなければコピーしてくる
if not exist "settings.json" (
copy "settings-default.json" "settings.json" /Y
)
このフォルダをどこかにコピー
set dst=C:\dokoka
xcopy . %dst% /I/H/E/Y
batと同フォルダに現在日時でログファイル作成
@echo off
cd /d %~dp0
set here=%~dp0
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
set logpath=%here%%now%.log
echo ログファイル → %logpath%
call hogehoge >> %logpath% 2>&1
call piyopiyo >> %logpath% 2>&1
echo 完了
pause >nul