バッチファイルでの%を含むファイル名の取得

このQ&Aのポイント
  • バッチ処理でフォルダごとの画像ファイルの数を取得する方法についてご質問です。
  • バッチ処理中にファイル名やフォルダ名に%が含まれる場合、正しく動作しない問題があります。
  • %を含むファイル名やフォルダ名を正しく取得するにはどうすれば良いでしょうか?
回答を見る
  • ベストアンサー

バッチファイルでの%を含むファイル名の取得

以下は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

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

こんにちは。いろいろと試されてますね。 以下の例は拡張子がjpgのファイルがあるフォルダとファイル数を表示するバッチの例です。"%"が含まれても問題ありません。 表示するだけでなく環境変数に格納したいならもう少し記載が 必要になります。 pushd e:\ dir /s *.jpg | findstr "のディレクトリ 個のファイル"

nasumiso2022
質問者

補足

回答ありがとうございます、先日は詳しい回答ありがとうございました 最終的に、%を名前に含むフォルダをmoveで移動する必要があるので、表示だけでなく、どうしても環境変数に代入する必要があります。 手間を取らせて申し訳ありませんが、気が向いた時にでも、正しく動かせる代入方法も書いていただけるとうれしいです、コマンドプロンプトはほかにも^やキリル文字でうまく動かないことが分かってきたので(shift_jisに起因する問題)C++にでも挑戦しようと思ってます。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.1

call文は引数が2度評価されるので、1度目に評価した結果に%が含まれると、更にその%を展開しようとします。 set /?で「遅延展開」について参照してみてください。 遅延展開により、for文の中でcall文を使用した際に2重評価されるのを防げる可能性があります。

関連するQ&A

  • こちらのバッチファイルの改修をお願いしたいです。

    過去に別のIDで質問したのですがパス紛失してしまったので・・・ http://okwave.jp/qa/q6858298.html?&status=true&errcode=&msg=&qid=6858298 改修の内容としては下記2点になります。 【○○】 [△△] □□.txt (1)○○や△△の部分にドット等の記号があるとそのファイルはスルーしてしまうので、スルーせずに動くように。 (2)もし、同じファイル名があったら上書きせずに「C:\被り」のフォルダに振り分ける。 どなたかお手すきでしたらよろしくお願い致します。 ----------- echo off set from=C:\振り分け set to=C:\整理済 for /f "delims=" %%a in ( 'dir /b "%from%\*.txt"' ) do call :sub "%%a" echo 振り分け終了しました exit /b :sub for /f "tokens=1 delims=]" %%f in ( "%~n1" ) do set findname=%%f] :FolderA if exist "%to%\A\%findname%*" move "%from%\%~nx1" "%to%\A\"&&goto :EOF :FolderB if exist "%to%\B\%findname%*" move "%from%\%~nx1" "%to%\B\"&&goto :EOF :FolderC if exist "%to%\C\%findname%*" move "%from%\%~nx1" "%to%\C\" goto :EOF

  • フォルダー内の複数ファイル名を一括で変名するbat

    フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="[com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

  • バッチファイルの使い方について

    このサイトで、両面スキャンした画像ファイルを表面と裏面を別々のフォルダに振り分ける方法を質問して、バッチファイルを使う方法を教えてもらったのですが、上手くいきません。バッチファイルを使うのは初めてなので、どこかまずいところがあるのかと思います。 教えていただいた下記のものそのままでバッチファイルを作り、画像ファイル(jpg)を格納したフォルダに置いてダブルクリックすると、「1」「2」のフォルダができるだけで、画像ファイルは移動せず、2つのフォルダは空のままです。 どこを直せばよいのか教えてください。よろしくお願いします。 set N=1 mkdir 1 mkdir 2 for %%I in (*.jpg) do call :sub %%I goto :EOF :sub move %%I %N% set /a N=3-N goto :EOF

  • バッチファイル パス名に( )や!がある場合の対処

    2つのフォルダの配下にあるすべてのファイルが一致していることを確認する 下記のtest.batのプログラムでは、フォルダ名やファイル名の中に、 ()や!が含まれていない時は正しく動作しますが、 含まれていると正しく動作しません。 (問1) パスに( )が含まれている場合 (例)set x=C:\tmp\sample\DATA(1)_SP\   set y=C:\tmp\sample\DATA(2)_SP\ は、 echo !j:%x%=!>> list1.txt の所で 「_SP\ の使い方が誤っています。」 と表示されて正しく動作しませんが どのようにすればよいでしょうか。 (問2) echo !j:%x%=!>> list1.txt を echo !j:!x!=!>> list1.txt にすると、環境変数xの部分が空白に置き換わらないのですが なぜでしょうか。 (問3) パスに!が含まれている場合 (例)DATA1とDATA2の配下に!ABCというフォルダがある場合   C:\tmp\sample\DATA1\!ABC\… は、 for /F "delims=" %%i in (list01.txt) の取り出しの時に!が抜け落ちてしまい 以後の処理が正しく行えません。 !が抜け落ちないようにするには どのようにすればよいでしょうか。 よろしくお願いします。 ---test.bat---------------------------------------------- setlocal enabledelayedexpansion @echo off set x=C:\tmp\sample\DATA1\ set y=C:\tmp\sample\DATA2\ if exist list1.txt del list1.txt if exist list2.txt del list2.txt dir /b /s /a-d %x% > list01.txt dir /b /s /a-d %y% > list02.txt for /F "delims=" %%i in (list01.txt) do ( set j=%%i echo !j:%x%=!>> list1.txt ) for /F "delims=" %%i in (list02.txt) do ( set j=%%i echo !j:%y%=!>> list2.txt ) fc /n /w list1.txt list2.txt > result.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。" goto :EOF ) else ( if exist result.txt del result.txt ) set cnt=1 set err_cnt=0 for /F "delims=" %%i in (list1.txt) do ( set /p<NUL=[!cnt!] fc /n /w "%x%%%i" "%y%%%i" >> nul if ERRORLEVEL 1 ( echo [!cnt!] %x%%%i >> result.txt fc /n /w "%x%%%i" "%y%%%i" 2>&1 >> result.txt set /a err_cnt=!err_cnt!+1 ) set /a cnt=!cnt!+1 ) echo; if %err_cnt%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="%err_cnt% 個が一致しませんでした。" ) ------------------------------------------------- 【動作環境】Windows7 コマンドプロンプト(Ver.6.1.7601)  

  • バッチファイル内置換

    バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。 ping出力を「file.txt」へ保存し、保存した「file.txt」を一行づつ読み出し下記を実行しています。 for /f "delims=" %%a in ( orig ) do ( set line=%%a call :sub ) :sub set tmp=%line% set tmp=%tmp:<=,% set tmp=%tmp:= =,,% set tmp=%tmp:"時間" =,% set tmp=%tmp:ms=,ms% echo %tmp%>>%CSV_Name% goto :EOF :end 置換出来ないのは、"=" と "<"の文字だけが置換出来ません。 ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。

  • notnotさん 応用が出来ず教えてください

    先日教えて頂きました2つを組み合わせたところ、C:\DDD内のファイルが 膨大なため処理時間がかなりかかってしまうことが判明しました。 そこでその2の処理ですが、その1で得られたC:\CCC内のファイルだけを 対象にC:\DDD内の同一ファイルを判定し、その結果同一である場合だけ C:\CCC内のファイルを削除したいのです。 親フォルダである\AAA~\DDD以下のサブフォルダの構成はどれも同じです。 説明が上手く出来ませんがよろしくお願いします。 その1 バッチファイルでファイルを比較後他のフォルダにコピ http://okwave.jp/qa/q7811159.html cd /d C:\AAA REM 以下のすべてのファイルについて、SUBを呼び出す for /f "delims=" %%F in ('dir /b /s /a-d') do call :SUB "%%~F" goto :EOF :SUB REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める set X="%~1" set Y=%X:C:\AAA=C:\BBB% set Z=%X:C:\AAA=C:\CCC% REM 内容の比較 fc %X% %Y% >NUL 2>NUL REM 一致したら戻る if %ERRORLEVEL% == 0 goto :EOF REM 一致しなかったらコピー echo F | xcopy %X% %Z% その2 http://okwave.jp/qa/q7819818.html http://okwave.jp/qa/q7819818.html @echo off cd /d C:\DDD for /f "delims=" %%A in ('dir /b /s /a-d') do ( for /f "tokens=1,2" %%B in ('dir "%%A" /t:c ^| findstr /b 2') do ( for /f "tokens=1,2" %%D in ('dir "%%A" /t:w ^| findstr /b 2') do ( if "%%B %%C" == "%%D %%E" del "%%A" ) ) )

  • バッチファイルで昨日の日付を取得

    すみません、どなたか教えて下さい。 バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。 今日の日付は下記のように取得しています。 rem 日時変数の取得 for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do ( set YYYYMMDD=%%a%%b%%c )

  • Win2000 バッチファイルについて

    こんにちは、 Win2000の環境で下記のバッチがうまく動作できません、”FIND:パラメータ書式が間違います”というエラーが出ています、ほかの2003,2008ではそういう現象が出ていません。 なぜでしょうか? そこの”^|”の”^”を消したとしても無理のようです。 ■簡単にバッチファイルが存在する領域の使用容量を算出するバッチファイルです。(一時ファイルの生成は利用しない、Findコマンドだけを使うという前提で) ソース: @echo off for /F "tokens=3" %%s in ('dir /s/-c ^| find "個のファイル"') do Set s=%%s echo %s% 分かって頂ければご教授ください。 誠にありがとうございます~~。

  • 英数11桁のファイルを消したい。

    特定のファイルを除き、英数11桁の画像ファイルを消したいと思っています。 その特定のファイルも英数11桁なのでややこしいことになっています。 作りかけですが、以下のようにしています。 echo off SET target_path=c:\test pushd %target_path% for %%f in ( * ) do call :sub "%%f" popd exit /b :sub set flag=OFF for %%e in ( nowprinting.gif nowprinting.jpg ) do if %1=="%%e" set flag=ON if "%flag%"=="ON" goto :EOF del %1 goto :EOF ディレクトリの中には、削除対象外の英数11桁ではないファイルもあるため、 チェックが必要です。 正規表現など足してみたのですがうまくいきません。 ご教授いただけないでしょうか。

  • バッチファイルでカウントアップするには

    :loop set id=0 if '%1' == '' goto end cd %1 if exist %1 for %%i in (*.bmp) do ( set id+=1 echo %id% ) shift goto loop :end pause バッチファイルをSend Toフォルダにおいて 送られてきた画像データをカウントアップしていきながら名前を id.bmp変えていきたいのですが、 idをカウントアップさせたいのですが方法がわかりません。 どうすればカウントアップされるのでしょうか?

専門家に質問してみよう