我发现 Robocopy 对语法很随意。我发现了与您类似的问题:
此代码有效:
Set Today=%DATE:~0,3%
Robocopy "G:\folder A" "U:\%Today%\folder A" ^
/S /XJD /R:25 /W:4 /NP /copyall ^
/LOG:"U:\%Today%\FolderALog.txt"
IF ERRORLEVEL 8 goto Badend
这个(结构良好的)代码不起作用
Set Today=%DATE:~0,3%
Set source="G:\folder A"
Set target="U:\%Today%\folder A"
Set Logname="U:\%Today%\FolderALog.txt"
Echo Source is %Source%
Echo Target is %Target%
Echo logfile named %Logname%
Pause
Robocopy %source% %target% ^
/S /XJD /R:25 /W:4 /NP /copyall ^
/LOG:%Logname%
Pause
但是,在第二个示例中,将第一个延续从命令行中取出,它可以工作:
Set Today=%DATE:~0,3%
Set source="G:\folder A"
Set target="U:\%Today%\folder A"
Set Logname="U:\%Today%\FolderALog.txt"
Echo Source is %Source%
Echo Target is %Target%
Echo logfile named %Logname%
Pause
Robocopy %source% %target% /S /XJD /R:25 /W:4 /NP /copyall ^
/LOG:%Logname%
Pause
自 DOS 时代以来,我一直在批处理命令作业中使用插入符号 (^) 作为延续字符,但在这种情况下,解析器尝试将其与前一个变量连接起来,并且作业终止,因为系统认为我正在尝试将文件夹命名为“U:\%Today%\folder A ^”。就是这样——你一直在尝试,直到有效果为止。故障排除技术:对新定义的变量进行回显然后暂停允许您检查拼写错误和放错位置的引号。最后的停顿让你有足够的时间阅读错误代码,如果有的话。我曾经遇到的另一件事是无意中在用引号括起来的路径中插入了一个不可打印的字符来代替空格。RoboCopy 非常强大,非常值得偶尔修改一些敏感的语法。