Windows バッチ FOR ループでフルパスを確保する方法

Windows バッチ FOR ループでフルパスを確保する方法

ディレクトリの内容をループし、各項目に対してコマンドを呼び出すことができる汎用バッチ (または Windows コマンド) ファイルを作成しました。

IF a%1==a ( set _DIR="%CD%") ELSE ( set _DIR="%~1")
IF a%2==a ( set _COMMAND=rem) ELSE ( set _COMMAND=%2)
IF a%3==a ( set _FILTER=*.*) ELSE ( set _FILTER=%3)
set _OPTS=%4

FOR /F "delims=" %%f IN ('dir %_DIR%\%_FILTER% %_OPTS% /b') DO (
%_COMMAND% "%%f"
)

%_COMMAND%しかし、正しいファイルを 呼び出すことを確認する方法を見つけようとしています。

のように、ディレクトリ変数を先頭に追加しようとしましたが、%_COMMAND% %_DIR%\"%%f"渡すパラメータに引用符が残ります。たとえば、バッチ ファイル を呼び出しexec_dir.bat、次の で呼び出すとecho_test.bat、 の実行時にすべてのファイルに引用符が付いていることがわかりますecho_test.bat

echo %~dpn1.mp4

このバッチ スクリプトは次を生成します。

> exec_dir.bat "C:\Users\User\Desktop\Test Folder" echo_test.bat *.txt
C:\Users\User\Desktop\Test Folder\"Test File.txt
C:\Users\User\Desktop\Test Folder\"Test2.txt

私の考えでは、これはエスケープ文字としての と関係があるのです\が、回避する方法がないようです。

答え1

ローカル設定
"%~1"=="" の場合 (dir=. を設定)、そうでない場合 (dir="%~1" を設定)
if "%~2"=="" (コマンド=echo を設定) else (コマンド=%~2 を設定)
if "%~3"=="" (マスク=*を設定) else (マスク=%~3を設定)
/r %dir% %%f で (%mask%) を実行し、%command% %%~dpnxf を実行します

あるいは単純に:

C:\>/r . %f で (*) を実行すると @echo %~dpnxf が実行されます

関連情報