Windows | |

Windowsバッチファイル (bat) のメモ

自分用。適当に追記。

  1. 基本
  2. 勝手にコマンドプロンプト閉じさせない
  3. コマンドプロンプトにコマンド表示させない
  4. bat自身のファイルパス・ディレクトリを取得する
  5. batから別のbatを実行する
  6. pauseの「続行するには何かキーを押してください」を表示させない
  7. ファイルに出力する
  8. 変数を使う
  9. PATHに追記する
  10. 現在日時をYYYYMMDDhhmmssで取得
  11. ファイルが存在したら消す
  12. フォルダが存在したら消す
  13. ファイルを上書きコピーする
  14. ファイル・フォルダをそのままコピーする
  15. npmコマンドを使う

基本

  • 文字コードは 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に追記する

setPATH の現在値に追加したいパスを結合してセットする。

set PATH=C:\path\to\something;%PATH%

現在日時をYYYYMMDDhhmmssで取得

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 フラグを指定すると、ファイルが存在してても確認せずに上書きする。

aaa.txtをbbb.txtに上書きコピー
copy aaa.txt bbb.txt /Y

ファイル・フォルダをそのままコピーする

xcopy で元の構造をそのままにコピーできる。

/I フラグを指定すると、コピー先のフォルダが存在しない場合に自動で作成してくれる。

/H フラグを指定すると、隠しファイルも完全にコピーする。

/E フラグを指定すると、コピー先に無いサブフォルダもコピーする。

/Y フラグを指定すると、ファイルが存在してても確認せずに上書きする。

aaaフォルダとその中身を全てbbbフォルダとしてコピーする
xcopy aaa bbb /I/H/E/Y

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