我制作了一个批处理程序,以递归方式在目录中执行一些简单的任务,它通常没有问题。但如果目录名称包含"&",则会出错。
@echo off
setlocal enableextensions disabledelayedexpansion
set "exitCode=0"
set "BaseDir=%~1"
if not defined BaseDir set "BaseDir=%CD%"
for %%f in ("%BaseDir%") do set "BaseDir=%%~ff"
if not exist "%BaseDir%" (
call :error "Base directory does not exist"
goto endProcess
)
call :recursive "%BaseDir%"
if errorlevel 1 set "exitCode=1"
goto :endProcess
:Whattodo
echo %CD%
goto :eof
:recursive BaseDir
setlocal
set "BaseDir=%~f1"
pushd "%BaseDir%"
for /d %%d in (*) do if not errorlevel 1 call :recursive "%%~fd"
call :Whattodo
popd
endlocal
goto :eof
:error
echo(%~1
set "exitCode=1" & cmd /d /q /c exit /b 1
goto :eof
:endProcess
endlocal & exit /b %exitCode%
我会得到这样的输出:
C:\tmp\01\04
C:\tmp\01\05
C:\tmp\01
C:\tmp\02\06
C:\tmp\02\07\08
C:\tmp\02\07
C:\tmp\02
C:\tmp\03
C:\tmp
但如果我有这样的目录" C:\ tmp \ 02 \ 06&一个"我将有这个输出
C:\tmp\01\04
C:\tmp\01\05
C:\tmp\01
C:\tmp\02\06
'a' is not recognized as an internal or external command,
C:\tmp\02
C:\tmp
我知道问题出在下面,但我不知道如何解决。
for /d %%d in (*) do if not errorlevel 1 call :recursive "%%~fd"
!!修改
在我发布之前,我尽力调试错误。 echo %CD%
只需打印当前目录,以帮助我调试。可能是cd
,错误将持续存在。 (我试过了)
我可以找到的是,变量"%%~fd"
已展开,而且行正在处理中。
以这种方式调用pass "C:\tmp\02\06"
(而不是"C:\tmp\02\06 & a"
)并尝试执行命令a
答案 0 :(得分:0)
像rojo说的那样,你的问题位于:Whattodo
函数中。
将echo %CD%
替换为echo !CD!
,它应该有效
由于百分比扩张容易受到特殊字符的影响,但延迟扩张并非如此
如果您不想总是启用它,则只能在该功能中启用它。
:Whattodo
setlocal EnableDelayedExpansion
echo !CD!
endlocal
goto :eof