2017-01-18 5 views
0

Windowsバッチのあるディレクトリにファイルを数えたいだけです。 (究極の目的は、私は一切のファイルを持っている場合、VBSファイルを呼び出すことです。)FOR(コマンドバッチ)を使用したファイルのカウント

ここ

は、私がこれまで持っているものです。

set /a db=0 
echo %db% 

for /f %%i in ('dir /b') do (
    set /a db=%db%+1 
    echo %db% 
) 

echo %db% 

これを私は次のようなります:0 0 0 0 1 %db% の値(私は現在ディレクトリに3つのファイルを持っています)

たぶん簡単ですが、ループ中に%db%の値が増えないのはなぜですか?

forの最後のループ(%db%はまだ0だった)と最後の行(%db%はすでに1です)の間ではどうなりますか?

どのように修正する必要がありますか?

ありがとうございます!

答えて

2

バッチファイルの実行中に、各行または行ブロック(括弧で囲まれた行)が最初に解析されて実行されます。解析フェーズでは、変数の読み取り操作(変数の値を取得する場所、つまり%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コマンドは失敗し、||条件付き演算子の後のコマンドが実行されます。

1

あなただけの任意のファイルがあるか否かを検出したい場合は、MC NDはすでにtheir answerで信頼性の高い方法を示しました。

find commandにファイルの数を数えるには、対応する行の数を数えるスイッチ/Cがあります。 /V(すべての一致しない行を返すように)を逆の検索に指定し、空の検索文字列""と一緒に指定すると、すべての行が返されます。 findための入力は、すべてのファイルを一覧表示しますdirコマンドラインから来るそう際、ファイルの合計数が返され (2> nulにはファイルが存在しない場合にはエラーメッセージを抑制):

2> nul dir /B /A:-D | find /C /V "" 

数をキャプチャするには彼らのためにimmediat処理されていないために、>|などの特殊文字は、^を前に付けてエスケープする必要があること

for /F %%C in (' 
    2^> nul dir /B /A:-D ^| find /C /V "" 
') do set "COUNT=%%C" 
echo %COUNT% 

注:変数で、for /F loopを使用elyで始まりcmdインスタンスのインスタンスはfor /Fです。

関連する問題