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 上)的命令,当命令完成时 自动关闭 ,可能没有给您足够的时间来查看输出。
我会尽量让这个问题变得非常简单。如果我 运行 以下内容,它可以正常工作:
$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 上)的命令,当命令完成时 自动关闭 ,可能没有给您足够的时间来查看输出。