通过网络驱动器循环 robocopy

Loop robocopy through network drives

编辑:如果有人关心这里是我原始代码的工作版本。 只有删除 "Drive C" 路径中的 space,我才能让 robocopy 使用 /r:1 /w:1 选项。 我现在知道,这绝不是最好的方法。

@echo off
setlocal enabledelayedexpansion
set "count=1"
set "local=c:\cmd_Scripts\"

:update
echo Connecting to machine !count!.
if exist "\10.3.71.6!count!\Disk_C\cmd_Scripts\" (
    robocopy %local% \10.3.71.6!count!\Disk_C\cmd_Scripts\ /r:1 /w:1
    echo Machine !count! DONE.
    echo.
    set /a count+=1
    if /i !count! LEQ 9 goto update
) else (
    echo MAchine !count! not available.
    echo.
    set /a count+=1
    if /i !count! LEQ 9 goto update
)

所以我又被卡住了。 如果网络驱动器可用,则工作正常,但如果不可用,则应转到下一个 IP。 我也不明白为什么需要打开“%target% 但无法关闭”。因此无法传递任何选项,例如 /r:1 /:w1

@echo off
set count=1
set "local=c:\cmd_Scripts\"
set "target=\10.3.71.6%count%\Disk C\cmd_Scripts\"

:update
if exist %target% (
    set "target=\10.3.71.6%count%\Disk C\cmd_Scripts\"
    robocopy %local% "%target%
    set /a count+=1
    if /i %count% LEQ 9 goto update
) else (
    set /a count+=1
    if /i %count% LEQ 9 goto update
)   
pause

谢谢 亚历克斯

也许远离计数并使用 for /l 代替。

@echo off
set "local=c:\cmd_Scripts\"
for /l %%i in (1,1,9) do (
if exist "\10.3.71.6%%i\Disk C\cmd_scripts\" robocopy "%local%" "\10.3.71.6%%i\Disk C\cmd_scripts\"
)

如果您确实需要设置 target 变量:

@echo off
Setlocal enabledelayedexpansion
set "local=c:\cmd_Scripts\"
for /l %%i in (1,1,9) do (
set "target=\10.3.71.6%%i\Disk C\cmd_scripts\"
if exist "!target!" robocopy "!local!" "!target!"
)

从 cmdline 执行 for /? 以了解它的作用,尤其是使用 /l 开关时。但简而言之,(1,1,9) 意味着我们从 1 开始计算,在 1 秒内到 9,并在这种情况下执行括号内的命令 9 次。

我大概会这样写:

@Echo Off
Set "DLocal=C:\cmd_Scripts"
Set "IPBase=\10.3.71.6"

For /L %%A In (1 1 9) Do If Exist "%IPBase%%%A\Disk %DLocal::=%\" (
    RoboCopy "%DLocal%" "%IPBase%%%A\Disk %DLocal::=%" /<options>
)
Pause

编辑

接下来的内容实际上是我回答的重复,但与您的问题代码更加相似。这意味着您可以预设 %target% 并在循环中使用它,而无需启用延迟扩展。

@Echo Off
Set "local=C:\cmd_Scripts"
Set "target=\10.3.71.6%%A\Disk %local::=%"

For /L %%A In (1 1 9) Do (
    Echo %target%
    If Exist "%target%\" RoboCopy "%local%" "%target%" /<options>
)
Pause