2

我有像E:\Backups\code\Hazard\test1...这样的文件夹testn

在这些测试文件夹中,类似E:\Backups\code\Hazard\test1\it0...itn

根文件夹是E:\Backups\code代码运行的地方。

以下代码在每个子文件夹上运行,并summary.ymlit0文件夹复制到最新it(n)文件夹。

为什么代码仅针对test1文件夹运行然后挂起?

setlocal ENABLEDELAYEDEXPANSION

set root=%cd%
for /D %%X in (%root%\*) do (
    echo %%X
    cd  %%X

    for /D /r %%b in (*) do ( 
        cd  %%b

        echo %%b

        for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :done
:done
        echo Last folder : %lastFolder%

        for /d    %%j in (*) do  (
            if /i "%%~nj"=="it0" COPY %%j\summary.yml %lastFolder% 
        )
        cd ..
    )
)
4

2 回答 2

1

我不确定robocopy的行应该做什么。看起来此命令用于获取当前目录中最后一个子目录的名称。

也许这段代码效果更好。但我无法测试它。

setlocal EnableDelayedExpansion
set "root=%cd%"

for /D %%X in ("%root%\*") do (
    echo %%X
    cd "%%~X"

    for /D /r %%b in (*) do (
        cd "%%~b"
        echo %%b

        call :GetLastFolder

        echo Last folder : !lastFolder!

        for /d %%j in (*) do (
            if /i "%%~nj"=="it0" copy "%%j\summary.yml" "!lastFolder!"
        )
        cd ..
    )
)
goto :EOF

:GetLastFolder
for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :EOF
goto :EOF

至少有必要lastFolder使用感叹号而不是百分号来引用环境变量,以便在此处真正使用延迟扩展。

goto :EOF退出子例程导致继续下面的行call :GetLastFolder

在主代码之后有一个goto :EOF或多个,以避免在大多数外部for循环完成exit /B后再次执行子例程的代码。这导致退出该批处理文件的处理。goto :EOF

要了解所使用的命令及其工作原理,请打开命令提示符窗口,至少在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。

  • call /?
  • for /?
  • goto /?
  • set /?
于 2015-10-26T21:10:53.743 回答
1

代码中有两个主要问题:

  • 如果在循环goto内使用for,则取消循环
  • 如果您在代码块内设置变量(括号内的代码),要在同一代码块内检索变量的值,您需要延迟扩展,启用它setlocal enabledelayedexpansion并更改用于从以下位置检索变量中的值的语法%var%进入!var!.

  • goto可以按照上一个答案中的说明删除,
  • 不需要延迟扩展。不要将for可替换参数的值存储在变量中,只需使用可替换参数

未经测试,但或多或​​少

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem E:\Backups\ code   \  Hazard \ test1 \ it0 ... itn
    rem             ^root     ^ %%X    ^ %%Y           ^ %%~dpc

    for /D %%X in ("*") do for /D %%Y in ("%%~fX\*") do for /f "tokens=1,2,*" %%a in ('
        robocopy "%%~fY." "%%~fY." file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs 
        ^| sort /r 2^>nul
        ^| cmd /q /v /c "(set /p .=&echo(!.!)"
    ') do copy "%%~fY\it0\summary.yml" "%%~dpc."

作为E:\Backups\code当前活动目录:

  • %%X将枚举E:\Backups\code( Hazard)下的文件夹
  • %%Y将枚举E:\Backups\code\Hazard( testn)下的文件夹
  • %%a执行robocopy命令以定位包含最新file.txt文件的文件夹
  • sort /r按降序对文件列表进行排序,因此最新的文件是列表中的第一个
  • cmd仅检索和输出第一行
  • 使用几个for可替换参数中的所有可用信息,执行指示的copy命令。
于 2015-10-26T21:37:55.903 回答