#navi(機能差異) ''コマンドプロンプトで直接コマンドを入力する時と、バッチスクリプト中で記述する場合に機能の違いについて'' #contents //////////////////////////////////////////////////////////////////////////// *%の置換 [#r86b2f74] バッチスクリプト中だと、%数字(~修飾子が付く場合もある)や%*は引数に置換される。引数置換でない単独の%は、次の%または:までが環境変数名とみなされる(参照:未定義環境変数)。対応する%や:の無い%は削除される。for文の制御変数のように%の文字が必要な場合は%%と2つ連続して書く。 %~から数字までの間に不正な~修飾子文字があるとエラーになる。~ %環境変数名: の後に置換や部分文字列指定の正しい書式が無い場合は、環境変数が定義済みなら%だけが削除され、未定義なら%から:まで全体が削除される。 set VAR=abc echo %VAR:aaa% → VAR:aaa echo %UNDEF:aaa% → aaa コマンドプロンプトでは、定義済み環境変数展開以外の%文字はそのまま残る。 //////////////////////////////////////////////////////////////////////////// *!の置換(遅延展開が有効な場合) [#pede28b7] バッチスクリプト中だと、単独の!は次の!または:までが環境変数名とみなされる(参照:未定義環境変数)。対応する!や:の無い!は削除される。!の文字が必要な場合は^でエスケープするが、^自体も特殊文字なので^でエスケープする必要があり、つまり^^!と2個の^を前置する。 !環境変数名: の後に置換や部分文字列指定の正しい書式が無い場合は、環境変数が定義済みなら!だけが削除され、未定義なら!から:まで全体が削除される。 コマンドプロンプトでは、定義済み環境変数展開以外の!文字はそのまま残る。 //////////////////////////////////////////////////////////////////////////// *未定義環境変数 [#g38ccd29] コマンドプロンプトでは、書いたまま残る。 バッチスクリプト中だと、空に置換される。 (これを利用してコメントを書くのに使える。あくまで変数展開なので%や:はコメントには使えない) @echo off %ここに書いても空に置換され、無視される% 未定義環境変数に対しての文字列置換や部分文字列の展開は、%から:までのみが削除される。:で変数展開が完結するため、:に続く文字はそのまま残り、続く%は(対応する%があれば)新たに環境変数展開を始める。つまり%に囲まれた内側と外側が逆転することになる。 set VAR=abc echo %VAR:a=X%VAR%VAR% → XbcVARabc echo %UNDEF:a=X%VAR%VAR% → a=XabcVAR //////////////////////////////////////////////////////////////////////////// *COPY/MOVEの/Yオプション [#g38ccd29] コマンドプロンプトでは、/-Y がデフォルトで同名ファイルがあれば上書き確認メッセージが出る。 バッチスクリプト中だと、/Y がデフォルトで同名ファイルがあってもメッセージを出さずに上書きする。 //////////////////////////////////////////////////////////////////////////// *GUIアプリの起動 [#j7597bf9] コマンドプロンプトからアプリを起動した場合、 コンソールアプリの場合はアプリ終了後にプロンプトが出るのに対して、 GUIアプリの起動の場合は終了を待たずにプロンプトが出て次のコマンドが入力可能となる。 バッチスクリプト中だと、GUIアプリであってもアプリ終了後でないと 次行のコマンドが実行されない。~ これはWin9x系と異なる仕様だ。Win9x系のようにGUIアプリの時に終了を待たずに次行のコマンドを実行するためには、start コマンドを使う必要がある。 逆に、Win9x系のように完了を待ちたいGUIアプリの起動にstart /waitをいちいちつける必要は無い。 //////////////////////////////////////////////////////////////////////////// #navi(機能差異)