BAT
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る(シェル)>シェル]] > [[スクリプティング]]
--BAT
--[[VBScript>VBS]]
--[[PowerShell]]
--[[Python>Python on Windows]]
* 目次 [#nca91418]
#contents
* 概要 [#r47618c1]
UNIX系OSのシェル・スクリプトに相当する。
*詳細 [#x803dc57]
-以下のようなトピック情報を纏めています。
--batファイルの勘所
--debugの方法
--環境変数/遅延展開~
**実行方法 [#k882fa6f]
-batファイルは、
--[[CMD]]で、手でコマンドを逐次実行する手順を、~
ほぼそのまま、batファイルに記述して、
--実行で順次実行する
>ためのファイルです。
-batファイルは[[CMD]]の中で実行します。~
--エクスプローラ上でダブルクリックすると、
--[[CMD]]が開いて、その中で実行、
--終了すると、[[CMD]]が閉じます。
**ヘルプ、サンプル [#r3d5d480]
***ヘルプ [#u1693ba3]
コマンドそれぞれの構文については記述しません。~
[[コチラ>CMD#ufd4e8d7]]の様に /? をつけて実行するとヘルプ...
***サンプル [#efe8de64]
サンプルや例が必要であれば、~
[[コチラ>CMD#ufd4e8d7]]の様なキーワードを使用して、~
site:microsoft.com バッチファイル for
の様に検索すると多数見つかります。~
* 勘所 [#d6d50335]
** コマンドライン引数と変数 [#v8fac8e3]
***引数の指定 [#dd94ff66]
batファイルを呼び出すときに、引数を指定できます。
testbat.bat arg1 arg2
***引数の取出 [#v029a125]
batファイル内では、引数は %数字 で取り出します。
echo arg1 は %1
echo arg2 は %2
***代入、表示、置換 [#i503a1e2]
batファイル内で、引数を変数に代入したり、 (set 変数名=値)~
変数を表示したり、 (変数の場合は %変数名% で囲む)~
変数の一部の文字を置き換えたり、 (%変数名:文字列1=文字列2...
set a1=%1
echo a1 は %a1%
echo 文字置き換え %a1:g=G%
***引数の数 [#d107750e]
%数字 は 1 から 9 まで使用できます。~
もし batファイルの引数が 10個以上必要処理する場合は、~
shift を使って、%引数を 1つ前へずらします。
:_nextparam
echo %1
shift
if NOT "%~1" == "" goto :_nextparam
:_end
***batファイル名 [#w3bacc78]
-引数の 数字 に 0 を指定すると、 batファイル名を取り出す...
--例えば、batファイルのファイル名から拡張子違いのデータフ...
--batファイル名が、 c:\temp\test1.bat であれば、 "c:\temp...
set dat="%~dpn0.csv"
-%0 は batファイル自身を表し、
-~ は 次の文字に従って解釈すること指定、
-dpn は ドライブ フォルダパス ファイル名 を取り出します。
-最後に .csv をくっつけます。
***変数と環境変数 [#n042ae3c]
batファイルでは、%変数名% は、環境変数と共通です。
-Windowsの環境変数は、
--コンピュータ >> プロパティ >> 詳細設定 に設定があります。
--この内容は、 batファイルから %環境変数名% で参照できま...
-batファイル内での環境変数は、
--下記でのみ、参照できます。
---batファイル内、
---および、batファイルから呼び出すコマンド
--set 環境変数名=値 を記述しても、~
コンピュータ >> プロパティ >> 詳細設定 の環境変数は変更さ...
***「"」の除去 [#gfe15da0]
引数、変数 は、 " " で囲んだまま展開されます。
以下のa1.batファイルがある場合、
set a=%1abc
「a1 "ABC"」 と実行すると、以下の様に展開されて
set a="ABC"abc
set が実行され、変数a に代入されます。
「"」を処理するには、 %~1 の様に 「~」 をつけて 「"」 を...
set a=%~1abc
の様にすると、以下の様に展開されて
set a=ABCabc
「"」を除去できます。
更に、
set a="%~1abc"
の様にすると、以下の様に展開されて、
set a="ABCabc"
余分な「"」を取り去りつつ、全体を「"」で囲むことができま...
「"」の扱いは、例えば if文 でどう記述するか、どう展開され...
batファイルが以下の場合、
if %1 == ABC (
echo ok
)
「a1 ABC」と起動すると ok ですが、~
「a1 "ABC"」と起動すると ok になりません。
この場合、
if "%~1" == "ABC" (
echo ok
)
の様にすると、 「a1 "ABC"」「a1 ABC」どちらでも ok になり...
** csvファイルの読み取り [#n7ed42ca]
for文を使って、区切り文字(delims=)、カラム(tokens=) を指...
下の batファイルは、csv の 2つめ 3つめ を echo します。~
また batファイルの引数に指定した 値 を 1カラム目に持つ行...
for文の ( )内は、' ' で囲んで、コマンドの出力から得るこ...
***batファイル: [#r1ba57d2]
for_3.bat
@setlocal
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
echo %%b %%c
if "%%a" == "%~1" (
echo 引数で指定されたパラメタは %%d です
)
)
@endlocal
***実行例: [#z0f73a20]
for_3.bat 123
bbb ccc
33 44
234 456
引数で指定されたパラメタは 678 です
for文に指定した %%a と tokens= に指定した数 に従...
%%a %%b %%c ... の順に自動で変数...
batファイルの変数は10個を超えると、shiftを使うなど、面倒...
事前にパラメタを設計するようなケースでは、パラメタ情報をc...
for文で取り出しながら、必要なバッチ処理をまとめて行う。~
というような処理も作れます。~
上の例での注意。~
-csvの値に「,」含めることは出来ません。「,」は区切り文字...
-"aa,bbb" の様にして " で囲むことも出来ません。
上の for文は、 ( )内に type コマンドを書きましたが、~
下の様に ( )内にファイル名を書くこともできます。~
ただし、この場合は、" " で囲んでいないことに注意。
for /F %%a in (for_3.csv) do (
echo %%a
)
ファイル名にスペースを含む場合は " " で囲みたいところです...
下の様に書くとファイル名そのものが 変数に設定されます。
for /F %%a in ("c:\temp\data files\for_3.csv") do (
echo %%a
)
**内部でコマンド実行 [#u781c84c]
***複数行に渡って記述する。 [#zf21a89c]
改行を入れてコマンドライン引数を複数の行に分けるには、~
Linuxの「¥」ではなく「^」が使える。。
***改行入りのパラメタを入力したい。 [#h41f1361]
LinuxのBashのEOF(ヒアドキュメント)は、WindowsのBATだと...
と言う記述があるがコマンドライン引数には適応できないので、~
当該引数がファイル入力をサポートしていないかを確認する。
***別のBATファイルを呼び出す。 [#f2025717]
CALLを使用する。
CALL BATファイル名 引数1 引数2 ...
**変数の遅延展開 [#f38c6e40]
***遅延展開 無効 [#vbf7d0ab]
for文で、~
do ( ... ) の ( )内に複数行に渡って記述できますが、 ~
( )内で 設定した変数を使用する場合は、~
変数が展開されるタイミングについて注意が必要です。
@setlocal
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
set /A var1=%%b + %%c
echo %%b + %%c は %var1%
)
@endlocal
***実行例: [#l1e4c792]
bbb + ccc は
33 + 44 は
234 + 456 は
このbatファイルで、 echo の %var1% は、~
for文を開始する直前に置き換えられて、空文字になっています。
***遅延展開 有効 [#tdd73170]
以下のbatファイルの様に
-setlocal ENABLEDELAYEDEXPANSION を指定して 遅延展開を有...
-変数を !変数名! と記述します。
@setlocal ENABLEDELAYEDEXPANSION
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
set /A var1=%%b + %%c
echo %%b + %%c は !var1!
)
@endlocal
***実行例: [#q5f23de6]
bbb + ccc は 0
33 + 44 は 77
234 + 456 は 690
遅延展開を有効にすると、!変数名! が現れた時点で値に置き換...
** 終了コード [#g160ab87]
batファイルの終了コードは、exit コマンドと共に指定します。
exit /B コード
ただし、
-exitコマンドはbatファイルが終了するので、
-batファイルの終了箇所で exit を使用します。
@setlocal
@echo off
set exitcode=0
dir c:\tempo
if %ERRORLEVEL% NEQ 0 (
set exitcode=2
echo dirがエラーです
)
exit /B %exitcode%
@endlocal
goto :EOF
このbatファイルは、
-exit の後にある @endlocal と goto :EOF は実行されません。
-exit /B が endlocal と goto :EOF を含んだ動作をします。
** debug方法 [#h946982a]
batファイルの効果的なdebugツールはありません。
-batファイル冒頭の @echo off をコメントアウトする
-echo を随所に埋め込んで、値を表示する
-pause を埋め込んで、その時点で一時停止させてみる
くらいしか方法がありません。
debugが終わったら、元に戻すのを忘れないでください。
以下の様に、debug用の echo を用意すると、戻す作業が少し簡...
@setlocal
@echo off
call :_debugprint 引数を確認: %1 %2 %3
for /F "delims=" %%a in ('dir "%~1"') (
echo %%a
)
@endlocal
goto :EOF
:_debugprint
@rem debugが終わったら、echo をコメントアウトする
echo %*
goto :EOF
* サンプル [#rf1d958d]
** 約数を求める [#ba143095]
***batファイル: [#c533e328]
yakusu.bat
@setlocal
@echo off
if "%1" == "" (
goto :_end
)
set a=%1
set /A b=%a% - 1
:_next
if NOT %b% GEQ 1 goto :_end
set /A c=%a% / %b% * %b%
if %c% == %a% (
echo %b%
)
set /A b=%b% -1
goto :_next
:_end
@endlocal
goto :EOF
***実行例: [#lc44a3db]
yakusu.bat 32
16
8
4
2
1
以下の set /A は、割って掛けることで、割り切れる数値かを...
set /A c=%a% / %b% * %b%
** カレントディレクトリ以下の VC++中間ファイルを削除 [#ze...
***batファイル: [#vf503037]
del-vc-obj.bat
@setlocal
@echo off
call :_vcfiles
@endlocal
goto :EOF
:_vcfiles
for %%i in (*.obj *.pcb *.pch *.ncb *.pdb *.ilk *.idb) d...
for /D %%i in (*) do (
pushd "%%i"
call :_vcfiles
popd
)
goto :EOF
***実行例: [#b2a4085f]
このbatファイルを実行すると、カレントディレクトリ以下のVC...
%cd% は[[CMD]]のカレントディレクトリを表す組み込みの変数...
2つめのfor文でサブディレクトリを列挙して、 pushd でカレン...
サブディレクトリへ移動し、 call :_vcfiles で自身を再帰呼...
*参考 [#a18d524a]
-バッチファイル - Wikipedia~
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81...
**知識ゼロからのwindowsバッチファイル超入門 [#off638fe]
https://jj-blues.com/cms/
**Qiita [#t752e0ef]
-Windowsバッチまとめ~
https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f
-【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ~
https://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a
**@IT [#j92ef103]
-Tech TIPS - 超入門コマンドプロンプト
--第1回「コマンドプロンプトとは」(1/4)~
http://www.atmarkit.co.jp/ait/articles/1709/13/news032.html
--第2回「Windowsのバッチファイルの基本的な使い方」(1/4)~
http://www.atmarkit.co.jp/ait/articles/1506/26/news026.html
--最終回「バッチコマンドで定型処理を行う」(1/3)~
http://www.atmarkit.co.jp/ait/articles/1709/15/news034.html
----
Tags: [[:シェル]], [[:インフラストラクチャ]], [[:Windows]]
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る(シェル)>シェル]] > [[スクリプティング]]
--BAT
--[[VBScript>VBS]]
--[[PowerShell]]
--[[Python>Python on Windows]]
* 目次 [#nca91418]
#contents
* 概要 [#r47618c1]
UNIX系OSのシェル・スクリプトに相当する。
*詳細 [#x803dc57]
-以下のようなトピック情報を纏めています。
--batファイルの勘所
--debugの方法
--環境変数/遅延展開~
**実行方法 [#k882fa6f]
-batファイルは、
--[[CMD]]で、手でコマンドを逐次実行する手順を、~
ほぼそのまま、batファイルに記述して、
--実行で順次実行する
>ためのファイルです。
-batファイルは[[CMD]]の中で実行します。~
--エクスプローラ上でダブルクリックすると、
--[[CMD]]が開いて、その中で実行、
--終了すると、[[CMD]]が閉じます。
**ヘルプ、サンプル [#r3d5d480]
***ヘルプ [#u1693ba3]
コマンドそれぞれの構文については記述しません。~
[[コチラ>CMD#ufd4e8d7]]の様に /? をつけて実行するとヘルプ...
***サンプル [#efe8de64]
サンプルや例が必要であれば、~
[[コチラ>CMD#ufd4e8d7]]の様なキーワードを使用して、~
site:microsoft.com バッチファイル for
の様に検索すると多数見つかります。~
* 勘所 [#d6d50335]
** コマンドライン引数と変数 [#v8fac8e3]
***引数の指定 [#dd94ff66]
batファイルを呼び出すときに、引数を指定できます。
testbat.bat arg1 arg2
***引数の取出 [#v029a125]
batファイル内では、引数は %数字 で取り出します。
echo arg1 は %1
echo arg2 は %2
***代入、表示、置換 [#i503a1e2]
batファイル内で、引数を変数に代入したり、 (set 変数名=値)~
変数を表示したり、 (変数の場合は %変数名% で囲む)~
変数の一部の文字を置き換えたり、 (%変数名:文字列1=文字列2...
set a1=%1
echo a1 は %a1%
echo 文字置き換え %a1:g=G%
***引数の数 [#d107750e]
%数字 は 1 から 9 まで使用できます。~
もし batファイルの引数が 10個以上必要処理する場合は、~
shift を使って、%引数を 1つ前へずらします。
:_nextparam
echo %1
shift
if NOT "%~1" == "" goto :_nextparam
:_end
***batファイル名 [#w3bacc78]
-引数の 数字 に 0 を指定すると、 batファイル名を取り出す...
--例えば、batファイルのファイル名から拡張子違いのデータフ...
--batファイル名が、 c:\temp\test1.bat であれば、 "c:\temp...
set dat="%~dpn0.csv"
-%0 は batファイル自身を表し、
-~ は 次の文字に従って解釈すること指定、
-dpn は ドライブ フォルダパス ファイル名 を取り出します。
-最後に .csv をくっつけます。
***変数と環境変数 [#n042ae3c]
batファイルでは、%変数名% は、環境変数と共通です。
-Windowsの環境変数は、
--コンピュータ >> プロパティ >> 詳細設定 に設定があります。
--この内容は、 batファイルから %環境変数名% で参照できま...
-batファイル内での環境変数は、
--下記でのみ、参照できます。
---batファイル内、
---および、batファイルから呼び出すコマンド
--set 環境変数名=値 を記述しても、~
コンピュータ >> プロパティ >> 詳細設定 の環境変数は変更さ...
***「"」の除去 [#gfe15da0]
引数、変数 は、 " " で囲んだまま展開されます。
以下のa1.batファイルがある場合、
set a=%1abc
「a1 "ABC"」 と実行すると、以下の様に展開されて
set a="ABC"abc
set が実行され、変数a に代入されます。
「"」を処理するには、 %~1 の様に 「~」 をつけて 「"」 を...
set a=%~1abc
の様にすると、以下の様に展開されて
set a=ABCabc
「"」を除去できます。
更に、
set a="%~1abc"
の様にすると、以下の様に展開されて、
set a="ABCabc"
余分な「"」を取り去りつつ、全体を「"」で囲むことができま...
「"」の扱いは、例えば if文 でどう記述するか、どう展開され...
batファイルが以下の場合、
if %1 == ABC (
echo ok
)
「a1 ABC」と起動すると ok ですが、~
「a1 "ABC"」と起動すると ok になりません。
この場合、
if "%~1" == "ABC" (
echo ok
)
の様にすると、 「a1 "ABC"」「a1 ABC」どちらでも ok になり...
** csvファイルの読み取り [#n7ed42ca]
for文を使って、区切り文字(delims=)、カラム(tokens=) を指...
下の batファイルは、csv の 2つめ 3つめ を echo します。~
また batファイルの引数に指定した 値 を 1カラム目に持つ行...
for文の ( )内は、' ' で囲んで、コマンドの出力から得るこ...
***batファイル: [#r1ba57d2]
for_3.bat
@setlocal
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
echo %%b %%c
if "%%a" == "%~1" (
echo 引数で指定されたパラメタは %%d です
)
)
@endlocal
***実行例: [#z0f73a20]
for_3.bat 123
bbb ccc
33 44
234 456
引数で指定されたパラメタは 678 です
for文に指定した %%a と tokens= に指定した数 に従...
%%a %%b %%c ... の順に自動で変数...
batファイルの変数は10個を超えると、shiftを使うなど、面倒...
事前にパラメタを設計するようなケースでは、パラメタ情報をc...
for文で取り出しながら、必要なバッチ処理をまとめて行う。~
というような処理も作れます。~
上の例での注意。~
-csvの値に「,」含めることは出来ません。「,」は区切り文字...
-"aa,bbb" の様にして " で囲むことも出来ません。
上の for文は、 ( )内に type コマンドを書きましたが、~
下の様に ( )内にファイル名を書くこともできます。~
ただし、この場合は、" " で囲んでいないことに注意。
for /F %%a in (for_3.csv) do (
echo %%a
)
ファイル名にスペースを含む場合は " " で囲みたいところです...
下の様に書くとファイル名そのものが 変数に設定されます。
for /F %%a in ("c:\temp\data files\for_3.csv") do (
echo %%a
)
**内部でコマンド実行 [#u781c84c]
***複数行に渡って記述する。 [#zf21a89c]
改行を入れてコマンドライン引数を複数の行に分けるには、~
Linuxの「¥」ではなく「^」が使える。。
***改行入りのパラメタを入力したい。 [#h41f1361]
LinuxのBashのEOF(ヒアドキュメント)は、WindowsのBATだと...
と言う記述があるがコマンドライン引数には適応できないので、~
当該引数がファイル入力をサポートしていないかを確認する。
***別のBATファイルを呼び出す。 [#f2025717]
CALLを使用する。
CALL BATファイル名 引数1 引数2 ...
**変数の遅延展開 [#f38c6e40]
***遅延展開 無効 [#vbf7d0ab]
for文で、~
do ( ... ) の ( )内に複数行に渡って記述できますが、 ~
( )内で 設定した変数を使用する場合は、~
変数が展開されるタイミングについて注意が必要です。
@setlocal
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
set /A var1=%%b + %%c
echo %%b + %%c は %var1%
)
@endlocal
***実行例: [#l1e4c792]
bbb + ccc は
33 + 44 は
234 + 456 は
このbatファイルで、 echo の %var1% は、~
for文を開始する直前に置き換えられて、空文字になっています。
***遅延展開 有効 [#tdd73170]
以下のbatファイルの様に
-setlocal ENABLEDELAYEDEXPANSION を指定して 遅延展開を有...
-変数を !変数名! と記述します。
@setlocal ENABLEDELAYEDEXPANSION
@echo off
set csv="%~dpn0.csv"
for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c ty...
set /A var1=%%b + %%c
echo %%b + %%c は !var1!
)
@endlocal
***実行例: [#q5f23de6]
bbb + ccc は 0
33 + 44 は 77
234 + 456 は 690
遅延展開を有効にすると、!変数名! が現れた時点で値に置き換...
** 終了コード [#g160ab87]
batファイルの終了コードは、exit コマンドと共に指定します。
exit /B コード
ただし、
-exitコマンドはbatファイルが終了するので、
-batファイルの終了箇所で exit を使用します。
@setlocal
@echo off
set exitcode=0
dir c:\tempo
if %ERRORLEVEL% NEQ 0 (
set exitcode=2
echo dirがエラーです
)
exit /B %exitcode%
@endlocal
goto :EOF
このbatファイルは、
-exit の後にある @endlocal と goto :EOF は実行されません。
-exit /B が endlocal と goto :EOF を含んだ動作をします。
** debug方法 [#h946982a]
batファイルの効果的なdebugツールはありません。
-batファイル冒頭の @echo off をコメントアウトする
-echo を随所に埋め込んで、値を表示する
-pause を埋め込んで、その時点で一時停止させてみる
くらいしか方法がありません。
debugが終わったら、元に戻すのを忘れないでください。
以下の様に、debug用の echo を用意すると、戻す作業が少し簡...
@setlocal
@echo off
call :_debugprint 引数を確認: %1 %2 %3
for /F "delims=" %%a in ('dir "%~1"') (
echo %%a
)
@endlocal
goto :EOF
:_debugprint
@rem debugが終わったら、echo をコメントアウトする
echo %*
goto :EOF
* サンプル [#rf1d958d]
** 約数を求める [#ba143095]
***batファイル: [#c533e328]
yakusu.bat
@setlocal
@echo off
if "%1" == "" (
goto :_end
)
set a=%1
set /A b=%a% - 1
:_next
if NOT %b% GEQ 1 goto :_end
set /A c=%a% / %b% * %b%
if %c% == %a% (
echo %b%
)
set /A b=%b% -1
goto :_next
:_end
@endlocal
goto :EOF
***実行例: [#lc44a3db]
yakusu.bat 32
16
8
4
2
1
以下の set /A は、割って掛けることで、割り切れる数値かを...
set /A c=%a% / %b% * %b%
** カレントディレクトリ以下の VC++中間ファイルを削除 [#ze...
***batファイル: [#vf503037]
del-vc-obj.bat
@setlocal
@echo off
call :_vcfiles
@endlocal
goto :EOF
:_vcfiles
for %%i in (*.obj *.pcb *.pch *.ncb *.pdb *.ilk *.idb) d...
for /D %%i in (*) do (
pushd "%%i"
call :_vcfiles
popd
)
goto :EOF
***実行例: [#b2a4085f]
このbatファイルを実行すると、カレントディレクトリ以下のVC...
%cd% は[[CMD]]のカレントディレクトリを表す組み込みの変数...
2つめのfor文でサブディレクトリを列挙して、 pushd でカレン...
サブディレクトリへ移動し、 call :_vcfiles で自身を再帰呼...
*参考 [#a18d524a]
-バッチファイル - Wikipedia~
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81...
**知識ゼロからのwindowsバッチファイル超入門 [#off638fe]
https://jj-blues.com/cms/
**Qiita [#t752e0ef]
-Windowsバッチまとめ~
https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f
-【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ~
https://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a
**@IT [#j92ef103]
-Tech TIPS - 超入門コマンドプロンプト
--第1回「コマンドプロンプトとは」(1/4)~
http://www.atmarkit.co.jp/ait/articles/1709/13/news032.html
--第2回「Windowsのバッチファイルの基本的な使い方」(1/4)~
http://www.atmarkit.co.jp/ait/articles/1506/26/news026.html
--最終回「バッチコマンドで定型処理を行う」(1/3)~
http://www.atmarkit.co.jp/ait/articles/1709/15/news034.html
----
Tags: [[:シェル]], [[:インフラストラクチャ]], [[:Windows]]
ページ名: