←
▼
▲
>call /?
バッチ プログラムを別のバッチ プログラムから呼び出します。
CALL [ドライブ:][パス]ファイル名 [バッチパラメータ]
バッチパラメータ バッチ プログラムで必要なコマンド ライン情報を指定します。
コマンド拡張機能を有効にすると、CALL は次のように変更されます:
CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。
構文は、次のとおりです:
CALL :ラベル 引数
指定された引数で新しいバッチ ファイル コンテキストが作成され、指定
されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの
最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから "戻る"
ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。
また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように
変更されました:
%* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
%5 など) を参照します。
バッチ パラメータ (%n) の置換は拡張されました。次のオプション構文
を使うことができます:
%~1 - すべての引用句 (") を削除して、
%1 を展開します。
%~f1 - %1 を完全修飾パス名に展開します。
%~d1 - %1 をドライブ文字だけに展開します。
%~p1 - %1 をパスだけに展開します。
%~n1 - %1 をファイル名だけに展開します。
%~x1 - %1 をファイル拡張子だけに展開します。
%~s1 - 展開されたパスは、短い名前だけを含みます。
%~a1 - %1 をファイル属性に展開します。
%~t1 - %1 をファイルの日付/時刻に展開します。
%~z1 - %1 をファイルのサイズに展開します。
%~$PATH:1 - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %1 を
展開します。環境変数名が定義されていない場合、
または検索してもファイルが見つからなかった
場合は、この修飾子を指定すると空の文字列に
展開されます。
修飾子を組み合わせて、複合結果を得ることもできます:
%~dp1 - %1 をドライブ文字とパスだけに展開します。
%~nx1 - %1 をファイル名と拡張子だけに展開します。
%~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
検索して %1 を探し、最初に見つかったファイル
のドライブ文字とパスだけに展開します。
%~ftza1 - %1 を DIR の出力行のように展開します。
上の例の %1 と PATH は、ほかの有効な値で置き換えることができ
ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
は %* と同時には使用できません。
呼び出し先で設定した環境変数は、戻ってきても引き継がれます。
goto :eof
call 元へ戻ります。 戻った先でも、%errorlevel% の値は変わりません。
call 先で設定された環境変数は、 call に続いて & で同じ行に書いた次の命令では
反映されていません。 call の次の行で反映されます。
set rr=0
call sub.bat & echo (%r%)
echo (%r%)
:sub_ret
set r=%rr%
goto ret
main.bat
sub.bat
set r=1
出力
(0)
(1)
第1引数を処理名にすると、同じファイルの中で call することができます。
@echo off
set _this=%0
if "%1"=="" goto _main
if "%1"=="_sub" shift & goto _sub
echo ERROR! invalid param1 of %_this% & pause & goto ret
:_main
echo _main
call %_this% _sub 1
pause
goto :ret
:_sub
echo _sub %1
goto :ret
:ret
set _this=
出力
_main
_sub 1
→ バッチファイル・テンプレート
コマンドプロンプトで入力したバッチファイル名になります。
>sample
sample
>..\sample.bat
..\sample.bat
バッチファイルをダブルクリックしたら、"" で囲まれたフルパスになります。
"C:\dir\file.bat"
>sample.bat "a b"
%1="a b"
%~1=a b
call a.bat
call :ExampleFunction "param1" "param2"
if errorlevel 1 ( exit /b )
同じバッチファイルの中をコール。
:ExampleFunction
echo ^>ExampleFunction "%~1" "%~2" "%~3" "%~4"
echo.
goto :eof
型チェックが無いので、ライブラリの引数の構成が変わると、移植が大変になります。
たとえば a_ で始まる環境変数を、パラメータ用にするとよいでしょう。
set a_paramX=
set a_Y=
リターンする直前や、初期化時に、a_ で始まる環境変数はリセットしてください。
goto ret
:ret
REM ^>call_return %0
call :label ... > log.txt とすると、サブルーチンの出力をすべてリダイレクトします。
:ret にジャンプします。
ジャンプ先となるラベル。
返り値を標準出力に出力します。
%1 などは、call の引数になります。
goto :eof で呼び出し元へ戻ります。
exit /b 0 でも呼び出し元へ戻ります。
呼び出し先で設定した環境変数は、戻ってきても引き継がれます。
& echo (%r%)
set r=%rr%
exit 1
バッチファイルを終了します。 1 は %errorlevel% に設定する値です。
参考
参考
つまり、環境変数はグローバル変数に相当します。
←
▼
▲
NUL リダイレクト
dir > nul
何も表示しません
環境変数を設定するバッチファイルの出力
echo set /A a=1 > setting.bat
call setting.bat
echo (%a%)
/A をつけないと、a="1" ではなく、a="1 " になってしまいます。
2>&1
で、標準エラー出力を、標準出力します。
( call bad.bat 2>&1 ) > log.txt
サンプル
標準入力の自動化
echo F | xcopy a.txt b.txt
xcopy a.txt b.txt < input.txt
xcopy に F と入力する
xcopy に input.txt の内容を入力
dir 2> nul
エラー出力は表示しません
( call bad.bat 2>&1 ) | tee log.txt
標準出力しながら、ファイルに出力する
( call bad.bat 2>&1 ) | safetee -o log.txt
command 2> err.txt
で、標準エラー出力をリダイレクトします。
→ safetee コマンド
子プロセスを起動するプログラムのリダイレクトの注意
それぞれのプロセスが printf する内容をファイルにリダイレクトした場合、
それぞれのプロセスごとに出力内容が集まります。 おそらく、バッファ
リングされているためと思われます。
process A 1
process B 1
process A 2
process B 2
リダイレクトしない場合
リダイレクトする場合
process A 1
process A 2
process B 1
process B 2
←
▼
▲
↓ コンベンショナル・メモリー
OSの機能を呼び出すときは、INT21 割込みを使う。
20ビットのアドレス = (「セグメント・レジスタ 16bit」 × 0x10 ) + 「オフセット・レジスタ 16bit」
20bit アドレス・レジスタを採用しなかったのは、Intel 8080 との互換のため。
MS-DOS on Intel 8086 のメモリマップ
Intel 8086 (1978年)
初代のIBM PC は 8088
→ Windows 3.x/95
関連
現在の PC (2008年) も、起動直後はリアルモード
←
▼
▲
指定されたプログラムまたはコマンドを実行するためにウィンドウを開きます。
START ["タイトル"] [/Dパス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/B] [コマンド/プログラム]
[パラメータ]
"タイトル" ウィンドウのタイトル バーに表示するタイトル。
パス 開始するディレクトリ。
B 新しいウィンドウを作成せずにアプリケーションを起動します。
アプリケーションは Ctrl+C を無視します。
アプリケーションで Ctrl+C を有効にしていない限り、
Ctrl+Break がアプリケーションを中断する唯一の方法です。
/I 新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境に
なります。
/MIN ウィンドウを最小化の状態で起動します。
/MAX ウィンドウを最大表示の状態で起動します。
/SEPARATE 16 ビットの Windows プログラムを別メモリ領域で起動します。
/SHARED 16 ビットの Windows プログラムを共有メモリ空間で起動します。
/LOW IDLE 優先度クラスでアプリケーションを起動します。
/NORMAL NORMAL 優先度クラスでアプリケーションを起動します。
/HIGH HIGH 優先度クラスでアプリケーションを起動します。
/REALTIME REALTIME 優先度クラスでアプリケーションを起動します。
/ABOVENORMAL
ABOVENORMAL 優先度クラスでアプリケーションを起動します。
/BELOWNORMAL
BELOWNORMAL 優先度クラスでアプリケーションを起動します。
/WAIT アプリケーションを起動し、終了するまで待ちます。
コマンド/プログラム
内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサ
は cmd.exe の /K オプションを使用して実行されます。これは、コ
マンドの実行の後でもウィンドウが残ることを意味します。
内部コマンドまたはバッチ ファイルではない場合、そのプログラム
はウィンドウ モードのアプリケーションまたはコンソール アプリ
ケーションとして動作します。
パラメータ コマンド/プログラムに渡すパラメータです。
コマンド拡張機能を有効にすると、コマンド ラインまたは START コマンドに
よる外部コマンドの起動は、次のように変更されます:
非実行可能ファイルは、ファイル名をコマンドとして入力することによって、
ファイルの関連付けを使って開くことができます (例: WORD.DOC は .DOC
ファイル拡張子に関連付けられているアプリケーションを起動します)。
コマンド スクリプト内でファイルの関連付けを作成する方法については、
ASSOC と FTYPE コマンドを参照してください。
32 ビット GUI アプリケーションを実行する場合、CMD.EXE は、アプリケー
ションの終了を待たずにコマンド プロンプトに戻ります。コマンド スク
リプト内で実行する場合は、この動作は発生しません。
最初のトークンが拡張子やパス修飾子を持たない文字列 "CMD" であるコマンド
ラインを実行する場合、"CMD" が COMSPEC 変数の値で置き換えられます。
これにより現在のディレクトリの CMD.EXE が使われないようにします。
最初のトークンが拡張子を含まないコマンド ラインを実行する場合、CMD.EXE
は、PATHEXT 環境変数の値を使って拡張子の種類と順序を判断します。
PATHEXT 変数の既定値は、次のとおりです:
.COM;.EXE;.BAT;.CMD
この構文は PATH 変数と同じであり、各要素はセミコロンで区切られて
いることに注意してください。
実行可能なファイルを検索するときにどの拡張子でも一致するファイルが見つ
からない場合は、拡張子なしの名前がディレクトリ名と一致するかどうかを調
べます。一致する場合は、START コマンドがそのパスでエクスプローラを起動
します。コマンド ラインから実行した場合は、そのパスに対する CD /D の実
行と同じになります。
ヘルプ
start "c:\Program Files\a.exe"
a.exe を実行するのではなく、タイトルになります。
start "title" "c:\Program Files\a.exe"
実行ファイルのパスに空白を含むときは、タイトル指定をする必要があります。
start /WAIT "" "a.exe" param
←
▼
▲
cd (移動先のパス)
pushd (移動先のパス)
popd
カレントフォルダを移動します。
後で、popd できるように、カレントフォルダを移動します。
pushd を実行したときのカレントフォルダに戻ります。
cd
カレントフォルダを標準出力へ出力します。
set basedir=%cd%
環境変数 basedir に、カレントフォルダを設定します。
cd /d (移動先のパス)
ドライブも移動します。
←
▼
▲
del
関連
←
▼
▲
ディレクトリ中のファイルとサブディレクトリを一覧表示します。
DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]ソート順]] [/P] [/Q] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]
[ドライブ:][パス][ファイル名]
一覧表示するドライブ、ディレクトリ、またはファイルを指定します。
/A 指定された属性のファイルを表示します。
属性 D ディレクトリ R 読み取り専用
H 隠しファイル A アーカイブ
S システム ファイル - その属性以外
/B ファイル名のみを表示します (見出しや要約が付きません)。
/C ファイル サイズを桁区切り表示します。これは
既定の設定です。/-C とすると桁区切り表示されません。
/D /W と同じですが、ファイルを列で並べ替えた一覧を表示します。
/L 小文字で表示します。
/N ファイル名を右端に表示する一覧形式を使用します。
/O ファイルを並べ替えて表示します。
ソート順 N 名前順 (アルファベット) S サイズ順 (小さいほうから)
E 拡張子順 (アルファベット) D 日時順 (古いほうから)
G グループ (ディレクトリから) - 降順
/P 1 画面ごとに停止して表示します。
/Q ファイルの所有者を表示します。
/S 指定されたディレクトリおよびそのサブディレクトリのすべての
ファイルを表示します。
/T どのタイムフィールドを表示するか、または並べ替えに使用するかを
指定します。
タイムフィールド C 作成
A 最終アクセス
W 最終更新
/W ワイド一覧形式で表示します。
/X このオプションは MS-DOS 形式以外のファイル名に対する短い名前を
表示します。長い名前の前に短い名前を表示する点を除けば、
/N オプションと同じです。短い名前がない場合は、ブランクに
なります。
/4 4 つの数字で年を表示します。
環境変数 DIRCMD にスイッチを設定できます。
/-W のように - (ハイフン) を前につけると、そのスイッチは無効になります。
ヘルプ
dir /S /B * > %USERPROFILE%\desktop\_file_list.txt
ファイル一覧を取得する(サブフォルダを含むカレント フォルダー)
dir /S /AR * > %USERPROFILE%\Desktop\_List.txt
読み取り専用ファイルを一覧する(サブフォルダを含む)
ファイルを検索する(サブフォルダを含む)
dir /S /B * | find "name"
キーワードは "" で囲むこと
/B を除くと、ファイルのサイズなどの情報も出力します
cd /d "%1"
dir /S /B * > _list.txt
SendTo バッチ
ファイル名の一覧だけをファイルにする
dir /B * > %USERPROFILE%\Desktop\_List.txt
tree /A C:\Folder > %USERPROFILE%\Desktop\_tree.txt
フォルダー・ツリーをデスクトップの _tree.txt ファイルに出力する
tree /F /A C:\Folder > %USERPROFILE%\Desktop\_tree.txt
… ファイルは含まない
… ファイルも含む
C:\Folder
C:\Folder
ディレクトリ以外は、/A-D
ファイルのタイムスタンプを一覧する
dir /S /A-D C:\Folder > %USERPROFILE%\Desktop\_List.txt
C:\Folder
←
▼
▲
→ DOSのコマンドでリダイレクト記号を使いたい
^ エスケープ文字を使う
@ でコマンドをはじめると、echo on でもエコー出力しません。
nmake の makefile
- でコマンドをはじめるのは
で使えます。
echo ^>
>
echo.
(空行)
(リダイレクトしない)
echo ERROR! >&2
エラー出力へ
echo Message
Message を表示します。
説明
echo の直後を2つの空白にすると、先頭に空白が表示されます。
←
▼
▲
pause
続行するには何かキーを押してください . . .
下記のメッセージを表示して、何かキーが押されるまで待ちます。
サンプル
if "%1"=="" pause
別のバッチから実行したときは止まらないようにできる pause
関連
何も表示しないで待つ
pause > nul
サンプル
←
▼
▲
timeout /T 3
下記のメッセージをカウントダウンしながら表示して、指定した秒数(上記なら3秒)が経過するか、
何かキーが押されるまで待ちます。
3 秒待っています。続行するには何かキーを押してください ...
ただし、timeout コマンドは、Windows 7 以降で使えます。
choice /T 3 /C n /D n /M "Wait a minute..."
choice を使った方法は、Windows 7 以降で使えます。 /T に秒数を指定します
VBScript から起動したバッチファイルでの制限事項
timeout コマンドは、無視されます。
choice コマンドは、停止してしまいます。
参考
ping コマンドは使えます。
call :timeout_ 3
goto :eof
:timeout_
echo Waiting %1 seconds ...
ping 1.1.1.1 -n 1 -w %1000 > nul
goto :eof
ping を使った方法は、Windows XP 以降で使えます。 -w にミリ秒を指定します。
ただし、実際に待つ時間は、1秒単位です。
←
▼
▲
set a=
set /p a=a の値を入力してください^>
echo %a%
ユーザーに任意の文字列を入力させるには、次のようにします。
Enter のみ入力したら、環境変数の値は、今までのままになります。
<, >, | は入力できません。
Windows XP では、choice が使えません。
if "%ROOT%" == "" @echo not defined ROOT&pause&goto :eof
set SRC=%ROOT%\obj
echo copy binaries.
set out=
set /p out=Root folder of release package^>
if (%out%)==() echo quit.&pause&goto :eof
if ^%out:~0,1% == ^" echo Don't close by ""&pause&goto :eof
if not exist %out% echo not found "%out%"&pause&goto :eof
REM /U option is copying files only exists in destination
xcopy /U %SRC%\* %out%
echo copied from %SRC% to %out%
set out=
%ROOT%\obj
ROOT
ROOT