人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: NaMgAlSiPSClArKCa
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● cx20
ベストアンサー

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

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


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

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」の設定を解除できます。

◎質問者からの返答

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

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

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

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ