バッチファイルの実行中に、各行または行ブロック(括弧で囲まれた行)が最初に解析されて実行されます。解析フェーズでは、変数の読み取り操作(変数の値を取得する場所、つまり%var%
)が削除され、変数内の値に置き換えられます。これが完了すると、結果のコマンドが実行されます。
for
ループ内では、db
変数が変更されていますが、変更された値は取得できません。 for
コマンドの実行を開始する前に、すべての読み取り操作が変数の値に置き換えられました。
この問題を解決する通常の方法は、遅延拡張を有効にして、%var%
の構文を必要に応じて!var!
の構文に変更することです。これは、行/ブロックが解析されたときではなく、コマンドが実行されるまで変数/値の置換を遅らせる必要があることをバッチパーサに伝えます。
setlocal enabledelayedexpansion
set /a db=0
echo %db%
for /f %%i in ('dir /b') do (
set /a db=!db!+1
echo !db!
)
echo %db%
今for
ループ内の読み出し動作は、遅延拡張を使用しています。
しかし、あなたはそれを必要としません。 set /a
はあなたが読み取り構文を使用せずに変数を変更するには、これらのオプションのいずれか
set /a db=db+1
set /a db+=1
を使用することができますので、参照される変数の値を取得することができ、独自のパーサを使用しています。
cmd
インスタンスで実行されるdir
コマンドの出力を処理するfor /f
を使用しないことをお勧めします。あなたが必要とするすべてのポイントとしては、任意のファイルではなく、それらの数を持っている場合は、このすべてがさえ
dir /a-d >nul 2>nul && (echo there are files) || (echo there is not any file)
を必要とされていません知っている場合だけ、for
ループ
set /a "db=0"
for %%a in (*) do set /a "db+=1"
echo %db%
を使用しますが、 dir
コマンドを実行し、除外されたフォルダ(/a-d
)、出力(>nul
)またはエラーメッセージ(2>nul
)を破棄します。 - ファイルが見つかった場合(エラーなし)、条件演算子&&
の後のコマンドが実行されます。 - ファイルがない場合、dir
コマンドは失敗し、||
条件付き演算子の後のコマンドが実行されます。