FC2ブログ

水雲風

とりあえず人生を記録と妄想の吐き出しの地

バッチファイルメモ(2008/12/02)

最近バッチファイルを作る機会があったんですが、いろいろ微妙な制限があるようです。
しかも、あまり仕様に関するドキュメントや情報が見つけられませんでした。
なので、メモをしておきます。
windows2000とXPでの動作を確認していますが、内容が間違ってるかもしれません。

■特殊文字のエスケープ

一般的にバッチで特殊文字「%&|><()」のエスケープは特殊文字の前に「^」を追加するか、特殊文字を含む文字列を「"」で囲むと良いようです。
ただし、環境変数が絡んでくるとうまくいかない場合があるみたいです。
特に環境変数を環境変数で定義するとうまくいかないようです。
ここらへんの仕様がよくわかりません。

以下にテストしたバッチを載せておきます。
※ 実行時には各echoしている行の先頭のremを外しています。

@echo off
setlocal

set TEST=test^>test
set TEST2=%TEST%
set TEST3=test>test
set TEST4="test>test"

rem echo "test>test" rem 1. 成功("test>test"と表示)
rem echo test>test rem 2. 失敗(>がリダイレクトとして認識される)
rem echo test^>test rem 3. 成功(test>testと表示)
rem echo "%TEST%" rem 4. 成功("test>test"と表示)
rem echo %TEST% rem 5. 失敗(>がリダイレクトとして認識される)
rem echo "%TEST2%" rem 6. 失敗(>がリダイレクトとして認識される)
rem echo "%TEST3%" rem 7. 失敗(>がリダイレクトとして認識される)
rem echo %TEST4% rem 8. 成功("test>test"と表示)

endlocal


■遅延展開

以下のバッチの例では、TEST環境変数に最初は0が代入され、次に1が代入されるため、最終的にはechoで1が出力されるように思えますが、実際は2が出力されます。

遅延展開かgotoでif文を抜けて、もう一方のif文を書くと対処できるようです。
遅延展開については、コマンドプロンプトで
set /?
とうつと表示される情報が詳しいみたいなのですが、書いてある事がよくわかりませんでした。
処理単位(if文の場合はelseの括弧が閉じるまで?)毎に環境変数が一律に置き換えられる仕様のようです。

@echo off
setlocal

set TEST=0
if %TEST% == 0 (
set TEST=1
if %TEST% == 1 (
echo 1
) else (
echo 2
)
) else (
echo 3
)

set /?

endlocal


■標準出力、標準エラー出力をせずにコマンド実行

標準出力、標準エラー出力をせずにコマンドを実行するバッチの例を以下に載せておきます。
例では、hogehogeというファイルがあればexistを、なければnot existを出力します。
「2>nul 1>nul」の部分で、dirコマンドの出力をしていないため、表示が見やすくなります。

@echo off
setlocal

dir hogehoge 2>nul 1>nul
if %errorlevel% == 0 (
echo exist
) else (
echo not exist
)

endlocal


2008/12/10追記
■バッチファイルからバッチファイルの呼び出し

特に何もせずにバッチファイルからバッチファイルを呼び出すと処理が戻ってこないみたいです。
処理を戻すにはcallコマンドを使ってバッチファイルを呼び出せばいいみたいです。
スポンサーサイト



  1. 2008/12/02(火) 22:03:58|
  2. 計算機
  3. | トラックバック:0
  4. | コメント:0
<<私信:携帯の機種変 | ホーム | 映画「死ぬまでにしたい10のこと」>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://mechagappa.blog14.fc2.com/tb.php/618-330025b4
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

おげれつ脱脂綿

カレンダー

08 | 2020/09 | 10
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -

カテゴリー

月別アーカイブ(タブ)

最近の記事

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

全ての記事を表示する

全ての記事を表示する