Windowsバッチファイル (bat) のメモ
自分用。適当に追記。
基本
- 文字コードは Shift_JIS にすること。
- 改行コードは CR+LF ……と思いきや、LFだけでも大丈夫な感じがする。
勝手にコマンドプロンプト閉じさせない
pause
最後に pause を書くと、キー入力があるまでは閉じないでくれる。
結果を画面に表示するようなプログラムを実行するとき、結果を確認するのによく使う。
echo www
pausecmd.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
pausebat自身のファイルパス・ディレクトリを取得する
%\dpn0 でファイルパスを、%`dp0` でディレクトリを取得できる。
batファイル自身が C:\path\to\me.bat の場合…
@echo off
echo %~dpn0
echo %~dp0
pauseC:\path\to\me
C:\path\to\カレントディレクトリをバッチファイルのディレクトリにする - 強火で進め
batから別のbatを実行する
start other.bat [引数1] [引数2] ...call other.bat [引数1] [引数2] ...pauseの「続行するには何かキーを押してください」を表示させない
pause >nulファイルに出力する
echo ahaha > a.txtecho ahaha >> a.txtcall hogehoge >> log 2>&1変数を使う
set {変数名}={値} で値をセットする。使うときは %{変数名}% と書くと使える。
値にスペースが入ってたりしても、特にクォートとかはしなくて平気。
@echo off
set aaa=www ww
echo %aaa%
pausewww wwPATHに追記する
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 buildcall 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/Ybatと同フォルダに現在日時でログファイル作成
@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
キリウ君が読まないノート