当目录名称包含"&"时,批处理文件以递归方式在目录中执行任务。

时间:2014-11-21 23:34:41

标签: batch-file recursion

我制作了一个批处理程序,以递归方式在目录中执行一些简单的任务,它通常没有问题。但如果目录名称包含"&",则会出错。

@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

1 个答案:

答案 0 :(得分:0)

像rojo说的那样,你的问题位于:Whattodo函数中。

echo %CD%替换为echo !CD!,它应该有效 由于百分比扩张容易受到特殊字符的影响,但延迟扩张并非如此 如果您不想总是启用它,则只能在该功能中启用它。

:Whattodo
    setlocal EnableDelayedExpansion
    echo !CD!
    endlocal
    goto :eof