バッチファイルのfor文についてです


バッチファイルのfor文で
set b=0
for /r "C:\" %%f in (*) do (
set /a b = b+1
echo %b%
)

このようにファイルをカウントして毎回変数bの値を出したいのですが値が0のままで変化がありません
for文のカッコの外にecho %b%をおいたらそこにはファイルの総数の値がでます
for文の中でカウントをするにはどうしたらいいでしょうか

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/02 00:21:16
  • 終了:2011/10/02 14:12:14

ベストアンサー

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082011/10/02 04:37:26

if や for 文でカッコを使って処理を記述した場合、

変数の内容は、カッコを抜けた後でないと反映されません。


対処方法としては、以下の2通りの方法が考えられます。

  • 環境変数の遅延展開を使う方法
    • 「setlocal enabledelayedexpansion」で 環境変数の遅延展開の機能を有効化します。
    • 「%b%」→「!b!」のように変数を「!」で囲むことで、実行時に展開されます。
setlocal enabledelayedexpansion
set b=0
for /r "C:\" %%f in (*) do (
    set /a b = b+1
    echo !b!
)

※ 「環境変数の遅延展開」の使用例は「SET /?」のヘルプに記載されています。

  • サブルーチン化する方法
set b=0
for /r "C:\" %%f in (*) do call :calc
goto :end

:calc
set /a b = b+1
echo %b%
goto :eof

:end

以下は参考情報です。

■ 遅延環境変数(バッチスクリプト)

http://sh4rk.6.ql.bz/?p=197

■ Windowsコマンドプロンプト基礎文法最速マスター - CX's Memo(Windows関連)

http://windows.g.hatena.ne.jp/cx20/20100203/p1

  • 追記

一部訂正です。

「遅延環境変数」→「環境変数の遅延展開」に訂正しました。

(展開の仕方が「%」と「!」の2通りあるだけで、遅延環境変数という変数があるわけではない為。)

C言語などのように変数を操作するという認識で合っているのでしょうか?

実行時に展開されるという意味ではそういう認識で合っているかと思います。

そして、遅延環境変数を使った場合のデメリットなどありますでしょうか?

レアなケースかと思いますが、フォルダ名やファイル名に「!」が含まれていた場合に、意図しない展開をしてしまい問題になるケースがあるようです。

■ 環境変数の遅延展開でハマった件について

http://www.kbstyle.net/guchi/20110717.html

そのような場合は「endlocal」を呼び出すことで「setlocal」の設定を解除できます。

id:NaMgAlSiPSClArKCa

わかりやすい説明ありがとう御座います!

遅延環境変数の方を使わせてもらおうと思います!

遅延環境変数についてですが、

C言語などのように変数を操作するという認識で合っているのでしょうか?

そして、遅延環境変数を使った場合のデメリットなどありますでしょうか?

2011/10/02 10:05:08
  • id:NaMgAlSiPSClArKCa
    レアなケースの遅延展開にはまってしまいました……

    なのでサブルーチン化の方にしましたありがとう御座いました

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません