3

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

具体FIRST_SCRIPT.bat如下——

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

具体SECOND_SCRIPT.bat如下——

ECHO %1

如果文件名包含 % 例如。“% of STATS.txt”,输出最终是

of STATS.txt

这是错误的。我试过使用Setlocal DisableDelayedExpansion但收效甚微

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

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

谢谢!

平台:Windows XP 的 cmd.exe

4

3 回答 3

6

Aacini 展示了一个可以使用%并且也可以使用的解决方案,!但它与 carets 一起失败^

但解决方案很简单。

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

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

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

set "var=%~1"
setlocal EnableDelayedExpansion
echo Filename: !var!
于 2013-08-19T06:32:42.467 回答
4

带有临时文件的解决方案:

first.bat

@ECHO OFF &SETLOCAL
REM to escape the '%' use a second '%'
SET "var=40%% &off!.txt"
REM get a random temp file name
:loop
SET "tname=%temp%%random%%random%"
IF EXIST "%tname%" GOTO :loop
SETLOCAL ENABLEDELAYEDEXPANSION
REM save the variable in the file
>"%tname%" (ECHO(!var!)
CALL "second.bat" "%tname%"
ENDLOCAL

second.bat

@ECHO OFF &SETLOCAL
SET "tname=%~1"
<"%tname%" set/p"var="
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !var!
DEL "%tname%" /F /Q

..输出是:

40% &off!.txt
于 2013-08-19T02:24:56.773 回答
3

编辑:我添加了启用/禁用延迟扩展技术以避免感叹号字符出现问题。

@echo off
setlocal DisableDelayedExpansion
for /F "delims=" %%a in ('dir /B *.txt') do echo %%a
echo/

for %%a in (*.txt) do (
SET "var=%%a" 
setlocal EnableDelayedExpansion
call :TEST_UPGRADE "!var:%%=%%%%!" "%%~a"
endlocal
)
goto :EOF

:TEST_UPGRADE
ECHO First: %1  Second: %2
exit /B

输出示例:

% of STATS.txt
Discount of 10% in all.txt
Normal file.txt

First: "% of STATS.txt"  Second: " of STATS.txt"
First: "Discount of 10% in all.txt"  Second: "Discount of 10 in all.txt"
First: "Normal file.txt"  Second: "Normal file.txt"
于 2013-08-19T01:48:48.950 回答