batファイルのあれこれ(コマンド編)
ここでは実際使用したコマンドの命令や、はまった点などがあるコマンドは注意点などを主に書いていきます。
・set(変数の設定)
set a=〇 |
で変数を設定出来ます。(上の例だと変数aに値を設定してます)
ちゃんとは理解できていないですが、この設定した変数はグローバル変数みたいな扱い?
*batファイルから違うbatファイルを呼び出す際に呼び出し側に設定した変数は呼び出す側でも同じ扱いになっていたので*
だと思ってます。
変数に設定した値の参照は %変数% になります。
*使用例*
set a=1 echo %a% set b=A echo %b% |
出力は
1
A
です。
echo a
echo b
だと出力は
a
b
となります。
慣れていないと%%を付け忘れるので気を付けましょう!
・echo
echoコマンドは標準出力にメッセージを表示するとあります。
C言語でいうところのprintf()
C++だとstd::cout
でコマンドプロンプトに文字列を出力する命令と同じになります。
*使用例*
echo Hello World |
どのbatファイルもほぼ最初に
@echo off |
と記述しています。
@echo offはコマンドプロンプトに文字列を出力しないようにする命令です。
これを記述していないと全行をコマンドプロンプトに出力する事になります。
標準だと出力状態なので行の先頭で@echo offを記述して出力しないように設定しています。
echo offだけだとコマンドプロンプトに off が出力されるので、@をコマンド行の先頭に置くとその行は表示されないようになっています。@を忘れずに付けましょう!
・pause
pauseコマンドは、その行で命令を一時停止する命令です。
コマンドプロンプト上で何かキーを押すとその行以降の命令を処理します。
バッチファイル終了待機待ちで使うことも多いと思います。
pauseコマンドはVisualStudioでのブレークポイント的な使い方をしました。
スペルミスなどでエラーが出た際にどこらへんでエラーが出ているかを調べる際に、pauseコマンドをエラーが出ていそうな箇所に挟み込むことでエラー箇所を絞り込んで調べられると思います。
・rem
remコマンドはコメントです。
remコマンドのある行はコメントとして解釈されるので、コメントを記述する際に使用しましょう!
*使用例*
rem コメントです。 |
・xcopy
参考サイト
・https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/xcopy
・https://www.k-tanaka.net/cmd/xcopy.php
xcopy 【コピー元ファイルパス】【コピー先ファイルパス】 【オプション】 |
xcopyコマンドは、ファイルをディレクトリ構造ごとコピーするのに使用します。
*使用例*
set from=【コピー元ファイルパス】 set to=【コピー先ファイルパス】 xcopy %from% %to% 【オプション】 |
このコマンドを実行すると、ファイルがfromからtoへディレクトリ構造ごとコピーされます。
オプションを設定する事で上書きのメッセージをスルーする、などが可能です。
各オプションについては参考サイトを確認してみてください。
・if exist(if not exist)
参考サイト
・https://jj-blues.com/cms/wantto-executeiffileexist/
if exsit【ファイル名】【コマンド】 |
このコマンドはファイル名に指定したファイルの存在を確認できるコマンドです。
ファイル名の後のコマンドは、ファイルが存在している場合に何かのコマンドを実行したい場合に記述します。
if と exist の間に not を挟む事でファイルが存在していない場合の処理にする事が出来ます。
if not exist 【確認したいファイル名等】【コマンド】 if exist 【ファイル名】( ファイルがある場合の処理 ) else ( ファイルがない場合の処理 ) |
上記の書き方でも同じ処理にはなります。
if exist ファイル名 ( コマンド ) else ( コマンド )
この書き方での注意点は、ファイル名 () else () のそれぞれ間に半角の空白が入っている点です。
C/C++などのプログラミングではelseの間に空白がなくても処理は通るので、その感覚で空白を挟まなければエラーが出てしまうため注意しましょう!
*使用例*
set file=a.txt if exist %file% del %file% if not exist【ファイル名】( echo %file%は存在していません ) else ( del %file% ) |
このコマンドを実行するとa.txtファイルがある場合はa.txtファイル削除します。
・for
参考サイト
・https://jj-blues.com/cms/command-for/#for01
for %%a in (*) do (何か処理) |
このコマンドはc/c++でもおなじみの繰り返しコマンドになります。
%%aは変数で、ここにファイルやフォルダーがあればファイル名、フォルダー名、変数が入ります。
このコマンドはファイル検索やフォルダー検索で主に使用しました。
for %%aの間に指定オプションを挟むと違う挙動で繰り返し処理が走ります。
オプションを指定しなければファイルを対象とした検索になります。
*使用例*
for /d %%a in【検索対象ファイルへのパス】do () for /l %%a in【開始の数,増加させる数,終了数】do () for /f %%a in【読み込み対象ファイル】do () |
/d をオプションで付けると、フォルダーを対象とした検索になります
/l をオプションに付けると 、c/c++ の for 文
for(int i = 0;i < 10; ++i){ 何かの処理 } |
と同等の処理になります。
/f をオプションで付けると、ファイルを一行毎に読み込み行の終わりまで読み込みます。%%aにはその内容が変数に入ります。
in () do の () に*.txt や *対象フォルダー名といった * を付加すると、対象の拡張子や対象のフォルダーを全て検索してくれます。
・move
参考サイト
・https://www.k-tanaka.net/cmd/move.php
move【オプション】【移動元ファイルパス】【移動先ファイルパス】 move 【オプション】【ファイル名】【ファイル名】 |
このコマンドはファイルやディレクトリを移動させるコマンドです。
moveの後にオプションを付けて上書きの確認などを設定できます。
*オプションは省略可です。*
move【ファイル名_1】【ファイル名_2】 |
のコマンドだとファイル名をファイル名_1→ファイル名_2に名前の変更になります。
・ren
参考サイト
・https://www.k-tanaka.net/cmd/ren-rename.php
ren【変更前ファイル名】【変更後ファイル名】 |
このコマンドはファイル名を変更するコマンドです。
moveコマンドでも名前の変更は出来ますが、moveだと意図しない名前変更に使用してしまう可能性もあるので、renの方が他の人が見ても分かりやすいかなと思います。
ワイルドカード(*)を使用する事で一括で名前の変更も可能です。
一括で変更したい場合は
ren *_texture *_capture |
等と使用すると良いかもしれません!
・call/start
参考サイト
・https://jj-blues.com/cms/command-start/
call【呼び出したいbatファイルやアプリケーション名】 start【呼び出したいbatファイルやアプリケーション名】 |
このコマンドは、現在起動しているbatファイルから他のbatファイルや直接起動したいアプリケーションを呼び出すコマンドになってます。
*batファイルだと自分自身を再度呼び出すことも可能*
他のフォルダーにあるbatファイルやアプリケーションを直接起動したい場合は、
start /d【パス指定】【 呼び出したいbatファイルやアプリケーション名】 |
と指定して呼び出します。
callでもstarでも、呼び出しコマンドに変わりませんが、挙動が違ってきます。
call:呼び出したbatファイルやアプリケーションの終了を待って次の命令に進みます。
start:呼び出したbatファイルやアプリケーションの終了を待たずにそのまま次の命令に進みます。
*startでも終了待ちたい場合 start /wait のオプションを追加するとcallと同等の挙動に変わります。*
start【オプション】【呼び出したいbaファイルやアプリケーション名】 |
オプション指定で他の挙動にもなるみたいです。
詳しくは参考サイトなどで確認してみてください。
call【呼び出したいbatファイル】【引数1】【引数2】【引数・・・】 start【呼び出したいbatファイル】【引数1】【引数2】【引数・・・】 |
call/startでbatファイルを呼び出す際に引数を渡す事も出来ます。
引数に文字列や変数を渡して呼び出したbatファイルでの処理に使用する事も可能です。
・md/mkdir
参考サイト
・https://www.k-tanaka.net/cmd/md.php
md【作成したいディレクトリ名(作成したい場所へのフルパス等・・・) mkdir【作成したいディレクトリ名(作成したい場所へのフルパス等・・・)】 |
このコマンドはディレクトリを作成するコマンドです。
ディレクトリ名だけだとカレントディレクトリに作成されます。
・rd/rmdir
参考サイト
・https://www.k-tanaka.net/cmd/rd.php
rd【オプション】【削除したいディレクトリ名(削除したい場所へのフルパス等・・・)】 rmdir【オプション】【削除したいディレクトリ名(削除したい場所へのフルパス等・・・)】 |
このコマンドは指定したディレクトリを削除するコマンドです。
rd/rmdir どちらでも同じ命令で書き方が違うだけなので書きやすい方を選択すればよいかと思います。
オプションは /s /q の2つになります。
/s はファイルとサブディレクトリを含めて削除します。
/s の後に /q を追加すると、削除する際に確認メッセージを表示せずに削除になります。
* /q がない場合だと削除の際確認メッセージが表示されます。*
・del
参考サイト
・https://www.k-tanaka.net/cmd/del.php
del 【オプション】【削除したいファイル(削除したい場所へのフルパス等・・・)】 |
このコマンドは指定したファイルを削除するコマンドです。
ディレクトリを指定した場合だとディレクトリ内のファイルを全て削除になります。
ディレクトリの削除は出来ないので、ディレクトリ削除には rd/rmdir を使用して削除しましょう。
オプションにも種類があります。詳しくは参考サイトを確認してみてください。
・cd/chdir
参考サイト
・https://jj-blues.com/cms/wantto-changedirectory/
・https://www.javadrive.jp/command/dir/index3.html
cd【/移動したいドライブ名】【移動先への絶対パスか相対パス】 chdir【/移動したいドライブ名】【移動先への絶対パスか相対パス】 |
このコマンドはカレントディレクトリから移動をするコマンドです。
cd/chdir どちらでも同じ命令で書き方が違うだけなため、書きやすい方を選択すればよいかと思います。
カレントドライブを変更したい場合は、移動したいドライブ名に移動先ドライブを指定してあげてください。
*/移動先ドライブ名 の箇所はドライブを移動しない場合は省略可能です*
batファイルがある場所に戻りたい時は、
cd %~dp0 |
のコマンドを実行するとbatファイルがあるカレントディレクトリに戻れます。
・tasklist | find
参考サイト
・https://itlogs.net/windows-bat-process-check/
tasklist | find 【実行中検索対象プロセス名(実行ファイル名)】 |
このコマンドは、2つのコマンドを組み合わせて実行中の検索対象プロセスを検索するコマンドです。
tasklist:実行中のプロセスの一覧を表示するコマンドです。
find:文字列を検索するコマンドです。
batファイルの環境変数にERRORLEVELという変数があります。
この変数は直前に実行したコマンドのエラーコードが格納されます。
成功していると0で失敗だと1が格納されます。
%ERRORLEVEL%で参照して、成功と失敗で適切な処理を書きましょう。
・goto
参考サイト
・https://www.javadrive.jp/command/bat/index11.html
goto 【ラベル名】 |
このコマンドはラベルの位置に命令を動かすコマンドになります。
*使用例*
for %a in (*) do ( if %a equ 検索対象ファイル等 ( goto Finish) ) :Finish echo Finish |
上の例だとカレントフォルダー内で検索したいファイルを検索して見つかれば、for文を抜けてラベル(:Finish)位置に制御が移動します。
forコマンドで使用するなら、c++などでのfor文内でbreakを使用するのと同等な処理にできるかと思います。
・setlocal ENABLEDELAYEDEXPANSION
参考サイト
・https://jj-blues.com/cms/wantto-changevalueinfor/
setlocal ENABLEDELAYEDEXPANSION |
このコマンドは、遅延環境変数の展開と呼ばれるコマンドになります。
if文やfor文内で計算して変数に代入→%変数%で参照すると得られる結果が期待した結果と違います。
ここの部分はまだちゃん理解できていないのですが、if文やfor文全体はすべての行が同時に読み込まれるので、if文やfor文内だと変数の変化がないようになってます。
*この部分は参考サイトの説明等を読んでみてください*
そこで遅延環境変数の展開の出番です。
setlocal ENABLEDELAYEDEXPANSION set sum=0 for /l %%n in (1,1,10) do ( set /a sum=!sum!+%%n echo !sum! ) |
遅延環境変数の展開を設定して !変数! で期待した結果が得られます。
*遅延環境変数での変数の参照は %変数%→!変数! になるので注意しましょう*
まとめ
今回使用したコマンドで印象的だったのが、tasklist | find です。
目的のアプリが起動しているか?アプリが終了したか?の特定が出来ます。
:WAIT rem 目的のアプリが起動するまで待機 set process=【目的のアプリ】 tasklist | find %process% > nul if %errorlevel%==1 ( goto WAIT ) :END rem 目的のアプリが終了するまで待機 tasklist | find %process% > nul if %errorlevel%==0 ( goto END ) |
アプリ側で他のアプリの制御している場合、
batファイルでその他のアプリを起動、終了しない方が良いので、それを監視して処理を進めるなどで対応しました。
目的のアプリが終了した後に何か処理をする必要がある際は良い使い方が出来るかと思います。
自分が使用したコマンドは上記のコマンドになります。
まだ他にも使用していないコマンドはあるので使用する事があれば追記していきたいと思います。