用于处理FOR LOOP中的随机%字符的批处理文件

Jai*_*Jai 3 cmd batch-file

我试图将文件名作为FOR循环参数传递给单独的批处理文件.问题是,如果文件名包含特殊字符(尤其是%),则参数不会转到被调用的脚本.EG -

FIRST_SCRIPT.bat如下-

cd "C:\theFolder"
for /R %%a in (*.*) do call SECOND_SCRIPT "%%~a"
Run Code Online (Sandbox Code Playgroud)

SECOND_SCRIPT.bat如下-

ECHO %1
Run Code Online (Sandbox Code Playgroud)

如果文件名包含%eg."%STATS.txt",输出结束

of STATS.txt
Run Code Online (Sandbox Code Playgroud)

哪个错了.我尝试过使用Setlocal DisableDelayedExpansion但收效甚微

Setlocal DisableDelayedExpansion
for /R %%a in (*.*) do (
SET "var=%%~a" 
Setlocal EnableDelayedExpansion
call TEST_UPGRADE "%var%" "%%~a"
)
Run Code Online (Sandbox Code Playgroud)

还有其他stackoverflow答案,但它们都需要事先知道%字符.由于文件名不在我们的控制范围内,因此这些解决方案对我们无效.有没有办法处理这个?

谢谢!

平台:用于Windows XP的cmd.exe

jeb*_*jeb 6

Aacini显示了一个解决方案,将与工作%,也!不过失败并插入符号^.

但解决方案很简单.

首先,必须禁用延迟扩展来处理感叹号.
文件名现在完全在var变量中.
插入符号和百分数的问题是由CALL.这可以CALL通过仅使用通过使用的第二百分比扩展阶段CALL来解决%%var%%.

Setlocal DisableDelayedExpansion
for /R %%a in (*.*) do (
  SET "var=%%~a" 
  call TEST_UPGRADE "%%var%%"
)
Run Code Online (Sandbox Code Playgroud)

下一个问题是在second.bat中显示文件名.这应该通过启用延迟扩展来完成,以避免特殊字符出现问题,或者您需要始终引用.

set "var=%~1"
setlocal EnableDelayedExpansion
echo Filename: !var!
Run Code Online (Sandbox Code Playgroud)