Batch file 批处理for循环中的第二个命令

Batch file 批处理for循环中的第二个命令,batch-file,for-loop,Batch File,For Loop,我想批量编写代码,如下所示: for %%a in (%list%) do ( command1 command2 command3 command4 . . . ) 正确执行列表第一个元素的第一个命令。但是在command2中有错误。在cmd窗口中,我可以看到发生了什么。在命令中,%%a未更改为值。存在“%a”而不是该值。在我的代码中有一个“%%a”,与command1中的完全相同 这里出了什么错?如何在批处理for循环中执行多个命

我想批量编写代码,如下所示:

for %%a in (%list%) do (
    command1
    command2
    command3
    command4
    .
    .  
    .
)
正确执行列表第一个元素的第一个命令。但是在command2中有错误。在cmd窗口中,我可以看到发生了什么。在命令中,%%a未更改为值。存在“%a”而不是该值。在我的代码中有一个“%%a”,与command1中的完全相同

这里出了什么错?如何在批处理for循环中执行多个命令

完整脚本:

set machines=pc1 pc2 pc3 pc4 
set source1="\\%%a\c$\Data1"
set source2="\\%%a\c$\Data2"
set dest1="\\server\share\%%a\data1\%date%
set dest2="\\server\share\%%a\data2\%date%
set log1=\\server\share\log\log_%date%_data1.txt
set log2=\\server\share\log\log_%date%_data2.txt
set mail="success"
set errormail="error"
set betreff="successmail"
set errorbetreff="errormail"
set empf="dummy@test.com" 
set blat="pathtoblat\blat.exe"
set error=0

for %%a in (%machines%) do (

    %windir%\system32\robocopy.exe %source1% %dest1% /e /COPYALL /log:%log1%

    if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto error
    ... different errorlevels
    if %ERRORLEVEL% EQU 0 echo No Change & goto next



    :error
    set error=1



    :next
    %windir%\system32\robocopy.exe %source2% %dest2% /e /COPYALL /log:%log2%

    if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto errormail
    ... different errorlevels
    if %ERRORLEVEL% EQU 0 echo No Change



    if error==1 goto errormail
    goto mail



    :errormail
    %blat% -to %empf% -f %COMPUTERNAME%@test.com -server 172.y.y.y -s %errorbetreff% -body %errormail% -attacht %log1%,%log2%
    goto loeschen

    :mail
    %blat% -to %empf% -f %COMPUTERNAME%@test.com -server 172.y.y.y -s %betreff% -body %mail%

    :loeschen
    setlocal enableextensions disabledelayedexpansion
    pushd "\\server\share\backup\%COMPUTERNAME%\data1" && (
        for /f "skip=2 delims=" %%a in (
            'dir /b /ad /tc /o-d'
        ) do rmdir /s /q "%%~fa"
        popd
    )

    setlocal enableextensions disabledelayedexpansion
    pushd "\\server\share\backup\%COMPUTERNAME%\data2" && (
        for /f "skip=2 delims=" %%a in (
            'dir /b /ad /tc /o-d'
        ) do rmdir /s /q "%%~fa"
        popd
    )

    setlocal enableextensions disabledelayedexpansion
    pushd "\\server\share\log" && (
        for /f "skip=4 delims=" %%a in (
            'dir /b /a-d /tc /o-d'
        ) do del /q "%%~fa"
        popd
    )
)

谢谢

现在已经清楚了错误的来源。
转到
中断了上下文的
,并且
%%a
不再存在。使用子例程和
调用重写批处理,而不是在文件中使用
转到

%%a
,因为脚本就是这样解析的,所以文件中的
%a
在命令提示符中看起来总是像
%a
,而问题出在命令中。但它完全是同一个命令。这是一个从一台pc(带有两个文件夹)到服务器的robocopy作业。列表是我要备份的机器列表。第一个命令\\pc1\folder1已备份。在第二个命令中失败,窗口中写入\\%a\folder2 instad of\\pc1\folder2可能是你列表中的一个特殊符号,比如括号引号…我现在没有时间给出完整的答案。但不能在FOR循环或IF块中使用GOTO。但是你可以用电话。此外,在设置变量的同一块中展开变量时,必须使用延迟展开。但在子例程的末尾仍然有
goto:eof
?!好的,我使用了exit/b,最后一个
goto:eof
设置在for循环后面。所以它工作得很好。非常感谢。