代码之家  ›  专栏  ›  技术社区  ›  Eric

在嵌套循环中使用变量%%f的批处理文件失败

  •  1
  • Eric  · 技术社区  · 7 年前

    set filepath=%1
    for /f %%f in ('dir /ad /b %filepath%') do (
    if exist "%filepath%\%%f\docs" (
    for /r %filepath%\%%f\docs %%r in (*.docx) do (
    echo %%f
    copy %%r "%cd%\edited"
    )
    )
    )
    

    输出

    if exist "C:\Documents\WordDocs\Data1\docs" (for /R C:\Documents\WordDocs\%f\docs %r in (*.docx) do ( 
    echo Data1
    copy %r "C:\Users\admin\Desktop\Test"
    ) ) )
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   aschipfl    7 年前

    这个 for command (如 if command )比其他命令更早解析。此时, 对于 变量引用,如 %%f for /R 无法使用包含 对于 变量引用类 . 对于的选项字符串也是如此 for /F . 您也不能使用 delayed expanded variable 而不是 %%f

    手边的脚本最简单的解决方法是使用 pushd "%filepath%\%%f\docs" 用于/R 循环和 popd 使用其默认根,即当前工作目录,该目录刚刚由 ; 前一个恢复时间为 . 以下是我的意思:

    set "filepath=%~1"
    for /F %%f in ('dir /A:D /B "%filepath%"') do (
        if exist "%filepath%\%%f\docs" (
            pushd "%filepath%\%%f\docs"
            for /R %%r in ("*.docx") do (
                echo/%%f
                copy "%%~r" "%cd%\edited"
            )
            popd
        )
    )
    

    用于/R 循环到一个子例程中,通过 call command 并将根路径作为 argument

    set "filepath=%~1"
    for /F %%f in ('dir /A:D /B "%filepath%"') do (
        if exist "%filepath%\%%f\docs" (
            call :SUB "%filepath%\%%f\docs"
        )
    )
    goto :EOF
    
    :SUB
    for /R "%~1" %%r in ("*.docx") do (
        echo/%%f
        copy "%%~r" "%cd%\edited"
    )
    goto :EOF
    

    参考此帖子: How does the Windows Command Interpreter (CMD.EXE) parse scripts?

        2
  •  1
  •   Compo    7 年前

    此版本不使用 For /R

    For /F "Delims=" %%A In ('Dir/B/AD-L "%~1"') Do If Exist "%~1\%%A\docs\" (
        For /F "Delims=" %%B In ('Dir/B/S/A-D-L "%~1\%%A\docs\*.docx"'
        ) Do Echo=Copy "%%~B" "%CD%\edited")
    Pause
    

    Echo= 在第3行,如果您对cmd窗口中的输出满意, 记住取消编辑目标路径