我试图将文件名作为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
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)
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |