コマンドプロンプト MS-DOSを使ってみよう!

MS-DOSとの関係、コマンドプロンプトの使用方法やバッチファイル作成方法など、ぜひ覚えて使ってみよう!

コマンドプロンプト MS-DOSを使ってみよう! バッチファイル
◆ echo

echo [[on | off] | [メッセージ]]

echoは、標準出力(画面)にコマンドプロンプトや各種メッセージを表示するかどうか
制御するコマンドである。
通常のコマンドプロンプトでも使用されるが、バッチファイル内で使われる事の方が多い。


パラメータ
 メッセージ・・画面に表示したい文字列を入力する。

コマンドプロンプトが表示された時点では、echoはonに設定されている。
つまり、初期状態でバッチファイルを実行すると、ファイルの内容や実行されたコマンドの出力結果、
展開処理されたバッチパラメータの内容も全て画面に表示されてしまう。
それで、バッチファイルの先頭でechoをoffに設定しておく。
バッチファイル実行中に画面表示する場合は、echoに続いて文字列をパラメータとして与える。

「echo off」をバッチファイルの先頭に記述しても、実際に表示が制御されるのは2行目以降である。
つまり1行目は初期状態である「echo on」になるので、「echo off」という文字列そのものが表示されてしまう。
そこで、echoコマンドの前に「@」をつけて「@echo off」と記述する。
「@」はそのコマンドを画面に表示せずに実行するためのバッチファイル用制御記号である。

空白行を挿入するには、echoに続いてピリオドをつけた  echo.  でも構わないし
括弧の]をつけた  echo]  でも代用できる。

■ 使用例 ■

・echoのオン・オフを切り替える

test.batの内容
@echo off
echo 表示される1
echo 表示される2
echo.
echo on
echo echoはオン
echo.

-----実行してみる----------
C:¥>test.bat
表示される1           ・・・echoはオフ
表示される2           ・・・echoはオフ
                   ・・・空行
                   ・・・この時点でechoはオン
C:¥>echo echoはオン     ・・・echo文そのものが表示される
echoはオン            ・・・echoの実行結果

C:¥>echo.            ・・・空行ではなくecho文そのものが表示される

-------------------------
◆ rem

rem [コメント]

remは、バッチファイル内にコマンド以外の注釈を書き込みたい時に使用するコマンドである。
remで書かれた文字列は、コマンドプロンプトではコマンドとして解釈、実行されない。
またecho offの状態ではコメントの内容では画面に表示されないので、コマンド説明などを書くとよい。


パラメータ
 コメント・・注釈としてバッチファイルに書きたい文字列を指定。

■ 使用例 ■

・注釈を書き込んだファイルを実行

test2.batの内容
@echo off
rem 表示される1
rem 表示される2
echo.
echo 処理が終了

-----実行してみる----------
C:¥>test2.bat

処理が終了
-------------------------
◆ pause

pause

pauseは、バッチファイルの処理を一時停止させるためのコマンドである。
「続行するには何かキーを押してください...」と表示され一旦そこで処理は止まる。
任意のキーを押すと処理は続行される。Ctrl+Cキーを押すと、その時点で処理は中止される。



■ 使用例 ■

・処理を一時中断させる

test3.batの内容
@echo off
echo %1 以下のテキストファイルを削除します。
pause
del %1¥*.txt
echo.
echo 処理が終了しました。

-----実行してみる----------
C:¥>test3 C:¥aaa
C:¥aaa以下のテキストファイルを削除します。
続行するには何かキーを押してください...
削除したファイル - C:¥aaa¥bbb.txt

処理が終了しました。
-------------------------
◆ if/else

1  if [not] exist ファイル名 (コマンド1) [else コマンド2]

2  if [/i] [not] 文字列1 == 文字列2 (コマンド1) [else コマンド2]

3  if [/i] 文字列1 比較演算子 文字列2 (コマンド1) [else コマンド2]

4  if [not] errorlevel 番号 (コマンド1) [else コマンド2]

5  if cmdextversion 番号 (コマンド1) [else コマンド2]

6  if defined 変数 (コマンド1) [else コマンド2]

ifは、バッチファイル内でプログラムの流れを制御する場合に使用するコマンドである。
書式ごとの使い方は下記を参照。


パラメータ
 ファイル名・・   ファイル名を入力する。
 コマンド1・・   ifコマンドで条件が真の場合に実行するコマンドを入力する。
           [not]が指定されていない場合は、コマンドにはパラメータを含める事ができる。
 else コマンド2・・  ifコマンドで条件が偽の場合に実行するコマンドを入力する。
               コマンドにはパラメータを含める事ができる。
 errorlevel 番号・・   直前に実行したコマンドが返す終了コードの番号が指定した番号等しいか大きい場合に
               「コマンド1」を実行し、そうでない場合には「コマンド2」を実行する。
 文字列1==文字列2・・   「文字列1」と「文字列2」が等しい場合に、条件は真になる。
 exist ファイル名・・   ファイルが存在する場合に、条件は真になる。
 文字列1 比較演算子 文字列2・・   「文字列1」と「文字列2」を比較して、比較演算子によって真偽を判定。
                        比較演算子は以下の6種類がある。
  • EQU  等しい
  • NEQ  等しくない
  • LSS  より小さい
  • LEQ  以下
  • GTR  より大きい
  • GEQ  以上
 cmdextversion 番号・・  コマンドインタープリタ「cmd.exe」の内部バージョンで比較し、
                内部バージョンが「番号」と等しいか大きい場合に、条件は真になる。
 defined 変数・・   環境変数名を受け取り、環境変数が定義されている場合に条件は真になる。

not
 指定した判定条件を反転させる。つまり条件が偽のときに、「コマンド1」が実行される。
/i
 文字列を比較する場合に、アルファベットの大文字と小文字を区別しない。


◆◆◆  書式ごとの使い方  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

1. この書式はファイルが存在するかどうかで実行するコマンドを切り替えている。
  注意しなくてはならないのは、コマンド1を( )でくくる点である。

2. 文字列同士の比較をして、実行するコマンドを切り替えている。
  固定文字列同士の比較もでき、バッチファイル用パラメータの%0~%9、%、*なども利用可能。

3. これは2を発展させてより高度な比較をしたい場合に使用する。比較演算子を使用して真偽を判定する。

4. errorlevelで他のプログラムの終了コードを検査する時に使用。
  コマンドプロンプトのほとんどのコマンドは、終了コードとしてコマンドが正常に終了すると「0」を、エラーが
  発生すると「1」を返す。直前のコマンドの完了コードを調べる事ができれば、バッチファイルの中で
  エラーの有無によって制御を切り替える事ができる。

5. コマンドインタープリタ「cmd.exe」での拡張機能バージョンを調査する際に使用する。
  始めのバージョンは1で、コマンド拡張機能に何か重要な拡張が追加された場合には値が1大きくなる。
  コマンド拡張機能が無効である場合は、cmdextversionの条件は常に偽となる。

6. 環境変数が定義されているかどうかを調査する。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
■ 使用例 ■

・文字列をアルファベットの大文字小文字を区別しないで比較

C:¥>if /i ABCD neq abcd (echo 等しい) else echo 等しくない

(この場合実行結果として「等しくない」と表示される)
◆ goto

goto ラベル名

gotoは、任意の場所に処理内容をジャンプさせるための制御コマンドである。
バッチファイルは、ファイルの先頭から順に実行されるが、gotoコマンドを使用すると
処理の流れを変える事ができる。


パラメータ
 ラベル名・・行頭にコロン「:」を付けた文字列を指定する。

バッチファイル中にgotoコマンドがあると、パラメータであるラベルを
バッチファイル中から探し出し、その行以降のコマンドに制御が移る。
条件分岐処理を行うifコマンドを組み合わせる事で条件分岐が可能に。
◆ call

call [ドライブ名:] [パス名] ファイル名 [バッチパラメータ]

callは、他のバッチファイルを呼び出すコマンドである。
バッチファイルの中から他のバッチファイルを呼び出す場合、バッチファイルに他のバッチファイル
名を記述しただけでは、呼び出された側のバッチファイルが終了するとそこ動作が終了してしまい、
元のバッチファイルに戻ってくる事ができない。
そこで、callの後に1バイトスペースを入力し、続いて他のバッチファイル名を記述する。
すると、呼び出された側のバッチファイルの処理が終わると、元の呼び出した側のバッチファイル
へ制御を戻す事ができる。


パラメータ
 ドライブ名・・呼び出すバッチファイルのドライブ名を指定。
 パス名・・呼びだすバッチファイルのパス名を指定。
 ファイル名・・呼びだすバッチファイルのファイル名を指定。

バッチパラメータが利用できる

修飾子 機能・用途
%~1 全ての引用句(")を削除して%1を展開する。
%~f1 %1を完全修飾パス名に展開する。
%~d1 %1をドライブ名だけに展開する。
%~p1 %1をパスだけに展開する。
%~n1 %1をファイル名だけに展開する。
%~x1 %1をファイル拡張子だけに展開する。
%~s1 展開されたパスはMS-DOSの「8.3形式」でも短い名前だけを含む。
%~a1 %1をファイル属性に展開する。
%~t1 %1をファイルの日付・時刻に展開する。
%~z1 %1をファイルのサイズに展開する。
%~$PATH:1 PATH環境に指定されているディレクトリを検索し、最初に見つかった完全修飾名 に%1を展開する。環境変数名が定義されていない場合、また検索してもファイルが見つからなかった 場合は、この修飾子を指定すると空の文字列に展開する。

** callコマンドではパイプとリダイレクトが使えない点は注意である。

■ 使用例 ■

・バッチファイルaaa.batからバッチファイルbbb.batを呼びだす
 (aaa.bat内に記述する)

call bbb.bat %1 %2
(aaa.bat内でbbb.batをパラメータを渡して呼びだす。)
◆ for

■ バッチファイル内 ■

for %%変数名 in (セット) do コマンド名 [コマンドパラメータ]

■ コマンドラインで ■

for %変数名 in (セット) do コマンド名 [コマンドパラメータ]

forは、バッチファイルやコマンドラインで複数のファイルに対し、繰り返し同じ コマンドを実行したい場合に利用するコマンドである。

パラメータ

%%変数名
単一文字の置き換えができるパラメータを指定する。
「a」から「z」または「A」から「Z」までの任意の1文字が利用できる。
大文字と小文字は区別される(大文字推奨)。
コマンドラインで使用する場合は「%変数」とするがバッチファイル内では「%%変数」とする。

(セット)
複数のファイル、ディレクトリ、文字列、値などのファイルセットを指定。 ワイルドカードも使用可能。

コマンド名
各ファイルごとに実行するコマンドを指定。

コマンドパラメータ
指定されたコマンドのパラメータやスイッチを指定。
パラメータを「%%変数名」で指定した変数とすると、(セット)で指定 した要素を1つずつコマンドにパラメータとして渡す。

in~do
パラメータとは言えないが、forコマンドの書式として必須。


/d
セットにワイルドカードが使われている場合、ディレクトリ名のみにマッチさせる。

/r [ドライブ名:[パス名]]
カレントディレクトリもしくは[ドライブ名]:[パス名]で指定したディレクトリ以下の 階層に対してもforコマンドを実行する。(再帰的処理)

/l
 反復しての繰り返し方法を指定。

/f [解析文字列]
セットにマッチしたファイルの各行を対象に、解析文字列によって指定された方法で トークンを切り出してコマンドを実行。

繰り返しの対象は「セット」で指定し、この「セット」のないように応じて変化する「%変数名」を渡すことで繰り返し処理を行う。

「%変数名」は、バッチファイル中ではパラメータ変数の「%1~%9」と区別するために「%%1~%%9」 と%を一個余分に記述する。(バッチファイル内)コマンドラインでは「%1~%9」でよい。


■オプションスイッチの機能

オプションには「/d」「/r」「/l」「/f」の4つがあり、コマンド拡張機能が有効であるときに指定可能。

「/d」オプションを指定すると、「セット」にワイルドカードが使われている場合に、ファイル名
ではなくディレクトリ名のみを処理対象にすることができる。

「/r」オプションは、カレントディレクトリもしくは指定したディレクトリ以下の全階層を
処理対象にすることができる。

「/l」オプションは「セット」に範囲を指定できる。
ステップの量ごとに変化する開始から終了までの数列を指定するわけで、「始点値 ,増分 ,終了値」
という形式で記述する。

「/f」オプションは「セット」の文字列に「解析文字列」で指定した指定どおりにトークンを
切り出して、doコマンドに引き渡して実行させる。セットにテキストファイル名があれば、
それらのテキストファイルの各行に対して順に処理が行われる。

■「/f」パラメータの解析文字列
解析文字列 指定内容
EOL=行末文字 行末文字を指定する。(1文字)
SKIP=行数 ファイルの先頭からスキップする行数を指定する。
DELIMS=区切り文字セット 区切り文字セットを指定する。既定の区切り文字セットはスペースとタブだが、このキーワードで変更することができる。
TOKENS=番号1,番号2,番号m–n 区切り文字(通常はスペースとタブだが、「DELIMS」で指定される文字も使える)で区切られた文字列(トークン)の何番目 を一時変数に割り当ててforの本体に渡すかを指定する。番号1と番号2のように複数のトークン番号を指定したときには、 forで指定した一時変数名の次の文字になる一時変数が作成され、その変数に2番目のトークンが割り振られる。 m番目からn番目というもっと広い数値範囲のトークンを指定する場合には「番号m–n」という表記を使う。 なお、「TOKENS=文字列」の最後の文字が「*」の場合は、その行の最後のトークンが解析された後で 追加の変数が自動的に割り当てられ、残りのテキストを受け取る。
USEBACKQ 「セット」での文字列の解釈方法を変更する。二重引用符でファイル名 セットのファイル名を囲み。逆引用符(`)で囲まれた 文字列をコマンドとして実行するように指定する。単一引用符で囲まれた文字列はそのまま文字列コマンドになる。

■オプションスイッチによる書式の変化

forコマンドは4つのオプションを指定する際には、forコマンドの書式(構文)が微妙に変化する。


  1. for /d %変数 in (セット) do コマンド [コマンドパラメータ]
  2. for /r [[ドライブ:]パス] %変数 in (セット) do コマンド [コマンドパラメータ]
  3. for /l %変数 in (開始,ステップ,終了) do コマンド [コマンドパラメータ]
  4. for /f ["オプション"] %変数 in (ファイル セット) do コマンド [コマンドパラメータ]
  5. for /f ["オプション"] %変数 in ("文字列") do コマンド [コマンドパラメータ]
  6. for /f ["オプション"] %変数 in ('コマンド') do コマンド [コマンドパラメータ]

/fパラメータの解析文字列でUSEBACKQオプションを指定する場合、以下の2つの書式が増える。


  1. for /f ["オプション"] %変数 in ('文字列') do コマンド [コマンドパラメータ]
  2. for /f ["オプション"] %変数 in (`コマンド`) do コマンド [コマンドパラメータ]
■ 使用例 ■

・1から3までの文字を表示する

echo off
for %%A in (1 2 3)do echo %%A
echo on

-----実行結果----------
C:¥>echo off



-------------------------
◆ shift

shift [/シフト開始番号]

shiftは、バッチファイル中の置き換え可能なパラメータの位置を、
1つずつ変更する制御コマンドである。
バッチファイルのパラメータには「%0」~「%9」の10個があるが、「%0」は
バッチファイル名が格納されているので、使用できるパラメータは9個という事になるので、
10個以上のパラメータを処理したいときは、shiftコマンドを使用する。


/シフト開始番号
 コマンドの拡張機能が有効である時に指定できる0~8の整数。
 パラメータのシフトが起こる番号を指定。
 例えば「/3」とすると、「%3」以降のパラメータがシフトされるが、「%0~2」はシフトされない。

■ 使用例 ■

・カレントディレクトリに存在する10以上のファイルを削除
 (確認メッセージあり)

delete.batの内容
@echo off
:dlt
if "%1"=="" goto end
if exist %1 del %1 /p
shift
goto dlt
:end

-----実行してみる----------
C:¥>delete a.txt b.doc c.xls d.txt e.pdf f.txt g.xls h.bat i.cmd j.ini
C:¥a.txt を削除しますか (Y/N)? y
C:¥b.doc を削除しますか (Y/N)? y
C:¥c.xls を削除しますか (Y/N)? y
C:¥d.txt を削除しますか (Y/N)? y
C:¥e.pdf を削除しますか (Y/N)? y
C:¥f.txt を削除しますか (Y/N)? y
C:¥g.xls を削除しますか (Y/N)? y
C:¥h.bat を削除しますか (Y/N)? y
C:¥i.cmd を削除しますか (Y/N)? y
C:¥j.ini を削除しますか (Y/N)? y


C:¥>
-------------------------
◆ setlocal,endlocal

setlocal [オプション]
・・・・・・・・・
endlocal

setlocalは、バッチファイルの中で設定・変更された環境変数を、そのバッチファイル
の実行中だけ有効にしてくれるコマンドで、endlocalはsetlocalコマンド以降に変更された環境変数
をリセットしてくれるコマンドである。
 バッチファイルの中では、一時的に環境変数を変更する場合がよくある。
 ただしそのままではコマンドプロンプトウィンドウで使用される環境変数も変更されたままなので、
 他のバッチファイルやコマンドラインからの動作に不具合が起きる場合がある。
 そこで使用するのがsetlocalとendlocalコマンドである。
 これらはペアで使う必要がある。


パラメータ
 enableextensions・・  対応するendlocalコマンドが実行されるまで、コマンド拡張機能を有効に。
 disableextensions・・  対応するendlocalコマンドが実行されるまで、コマンド拡張機能を無効に。
 enabledelayedexpansion・・  対応するendlocalコマンドが実行されるまで、遅延環境変数の展開を有効に。
 disabledelayedexpansion・・  対応するendlocalコマンドが実行されるまで、遅延環境変数の展開を無効に。

■ 使用例 ■

・setlocalでコマンドで変更した環境変数をendlocalで元に戻す

set.batの内容
@echo off
setlocal
path=C:¥
ping 65.155.232.10
endlocal
ping 65.155.232.10

-----実行してみる----------
C:¥>set.bat

上記のファイルでは、setlocalコマンドを実行して、コマンド検索パスを変更してしまった。
そのため、外部コマンドであるpingは実行プログラムとして認識されず、エラーになってしまう。
しかし、endlocalを実行すれば、一時的に変更されたPATHは設定の規定値に戻るため、
最後のpingコマンドは正常に実行される。

-------------------------



Copyright © 2004 - ykr414. All Rights Reserved.