【问题标题】:Can't stack robocopy and ren in batch无法批量堆叠 robocopy 和 ren
【发布时间】:2017-02-02 10:22:09
【问题描述】:

我正在尝试在 Windows 中一次批量执行三个命令:robocopycdren。一个例子是我想将文件复制到另一个目录,然后在它们的名字后面添加.bak。我使用&& 来堆叠命令:

robocopy C:\original D:\backup && cd D:\backup && ren * *.bkp

但是,如果我只是在命令提示符中输入第一个位:

robocopy C:\original D:\backup && cd D:\backup

目录实际上并没有改变。我需要手动插入第二个命令。

我也试过了

robocopy C:\original D:\backup && ren D:\backup\* *.bkp

同样,它仅在我手动单独执行命令时才有效。如果我执行整个命令,则只执行第一位(robocopy)。

【问题讨论】:

  • 您不能使用ren 将文件移动到其他驱动器。请改用move
  • cmd1 && cmd2 表示“只有在 cmd1 成功时才运行 cmd2”,而 cmd1 & cmd2 表示“运行 cmd1 然后运行 ​​cmd2”。
  • 嗯? Batch 总是一次运行一个命令。你不需要做任何特别的事情来实现它。
  • 当涉及到ErrorLevel时,请注意robocopy,因为该命令在成功的情况下也会返回non-zero values,例如指示文件是否已被复制;所以&&之后的命令可能不会被意外执行...
  • @SkeletonBow:如果您愿意,可以使用&,但您也可以将每个命令放在单独的行上。它会做完全相同的事情,并且更容易阅读。

标签: windows batch-file cmd


【解决方案1】:

&& 表示仅当上一个命令成功(或返回错误级别0)时才执行下一个命令。同样,|| 仅在上一个命令失败(或返回大于0 的错误级别)时执行下一个命令

一些例子是:

copy null null   ||  echo this command failed

rundll32         &&  echo this command was successful

copy 1.txt 2.txt &&  echo success  ||  echo failed


所以如果你想copy一个文件,change目录然后rename一个文件,你会做类似的事情:

robocopy C:\original D:\backup & cd D:\backup & ren * *.bkp

请记住,如果 robocopy 无法仅复制 1 文件(或更多),则您不能使用 &&

一个更强大的选项将检查D:\backup 是否存在:

(robocopy C:\original D:\backup & if exist "D:\backup" (pushd D:\backup & ren * *.bkp) else (echo Failed to create D:\backup 2>nul)) >nul

它将pushd 进入目录,并且只有当robocopy 命令成功时才会重命名文件,另外隐藏除错误之外的所有消息

【讨论】:

  • 请记住,如果 robocopy 无法仅复制一个文件 - 情况会更糟。正如您所指出的,||&& 运算符假定返回代码为零表示成功,非零表示失败。但 Robocopy 不遵循该约定,返回值 4 或更高意味着失败。如果我没记错的话,如果没有需要复制的文件,它只会返回零。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2023-03-18
相关资源
最近更新 更多