「これはヤバかったな」という遅刻エピソード

以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。

@echo off
pushd E:\
for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j"
exit /b

:sub
echo ///////////////////////////////////////////////////////////////////////////
for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x
for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x
for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x
for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x

echo %1
echo jpg %jpg_c%
echo png %png_c%
echo bmp %bmp_c%
echo JPG %jpg2_c%
goto :EOF

:jpg
set jpg_c=%1
:echo %1
goto:EOF

:jpg2
set jpg2_c=%1
:echo %1
goto:EOF

:png
set png_c=%1
:echo %1
goto:EOF

:bmp
set bmp_c=%1
:echo %1
goto:EOF

:all
set all_c=%1
:echo %1
goto:EOF

A 回答 (2件)

こんにちは。

いろいろと試されてますね。

以下の例は拡張子がjpgのファイルがあるフォルダとファイル数を表示するバッチの例です。"%"が含まれても問題ありません。
表示するだけでなく環境変数に格納したいならもう少し記載が
必要になります。

pushd e:\
dir /s *.jpg | findstr "のディレクトリ 個のファイル"

この回答への補足

回答ありがとうございます、先日は詳しい回答ありがとうございました

最終的に、%を名前に含むフォルダをmoveで移動する必要があるので、表示だけでなく、どうしても環境変数に代入する必要があります。

手間を取らせて申し訳ありませんが、気が向いた時にでも、正しく動かせる代入方法も書いていただけるとうれしいです、コマンドプロンプトはほかにも^やキリル文字でうまく動かないことが分かってきたので(shift_jisに起因する問題)C++にでも挑戦しようと思ってます。

補足日時:2012/01/28 02:00
    • good
    • 0

call文は引数が2度評価されるので、1度目に評価した結果に%が含まれると、更にその%を展開しようとします。



set /?で「遅延展開」について参照してみてください。

遅延展開により、for文の中でcall文を使用した際に2重評価されるのを防げる可能性があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!