RoboCopy.exe 开关在 Powershell 脚本中不起作用

RoboCopy.exe switches not working in Powershell script

我会尽量让这个问题变得非常简单。如果我 运行 以下内容,它可以正常工作:

$localData = "C:\"
$netData = "\OtherPC\shared\"
Start-Process "RoboCopy.exe" -argumentlist " `"$localData`" `"$netData`" "

但是,一旦我添加了任何开关(见下文),它就不起作用了。没有错误。

$localData = "C:\"
$netData = "\OtherPC\shared\"
Start-Process "RoboCopy.exe" -argumentlist " `"$localData`" `"$netData`" /copyall"

尝试和修复真的很痛苦,感谢任何帮助。

编辑: 已修复,这是最终的工作语法:

$localFiles = "C:\Users\"
$netFiles = "\netLocation\migration\Users\"

Start-Process "RoboCopy.exe" -NoNewWindow -argumentlist " `"$localFiles\`" `"$netFiles\`" /s /r:1 /w:5 /mt:16"

顺便说一句:您使用 Start-Process 可能是有意 运行 一个冗长的操作 异步 ,在 new window,但更典型的情况是在中执行Robocopy.exe 同步等控制台应用程序]相同 window,在这种情况下,您需要直接 c:\path\to\some.exe ...& $exePath ...)调用它们 - 参见 this answer. An alternative to asynchronous execution in a new window is to use a background job.

如果路径参数(最终)包含在 "..."[= 中,您必须 double 74=]在命令行中(最终)提交:

只需用尾随 \ 定义您的变量值,这将使您的命令起作用:

$localData = 'C:\'
$netData = '\OtherPC\shared\'

文件路径的另一个解决方案(在Windows上)具体是插入一个space 在尾随 \" 之间。这是可行的,因为文件系统 WinAPI 调用会忽略路径中的尾随 spaces。

最后需要 \ 的原因是 RoboCopy.exe(事实上,实际上 所有 外部程序)将序列 \" 解释为 转义 " 字符 而不是 逐字 而不是 [= =46=]句法函数。

如果您需要以编程方式追加额外的 \ ,请使用以下内容:

$localDataEscaped = $localData -replace '\$', '\'
$netDataEscaped = $netData -replace '\$', '\'

Start-Process 个调用的调试提示

(暂时)在调用中添加-NoNewWindow -Wait,这使得命令输出出现在相同的window,让您有机会检查它;默认情况下,Start-Process 运行 是新的 window(在 Windows 上)的命令,当命令完成时 自动关闭 ,可能没有给您足够的时间来查看输出。