【问题标题】:Robocopy didn't recognize options when launched from PowerShell从 PowerShell 启动时,Robocopy 无法识别选项
【发布时间】:2017-02-27 22:00:43
【问题描述】:

我正在尝试使用 PowerShell cmdlet Invoke-Expression 来启动 RoboCopy。

In the script below, RoboCopy worked fine when the option was simply '.' but as soon as the option '/MIR' was added I got this "Invalid Parameter #3" error.

RoboCopy 似乎在解析“/MIR”时遇到问题,并且在选项中的正斜杠上卡住了。我试过使用各种转义字符都无济于事!

# Source & Destination paths
#
  [string]$srcPath = 'C:\folderSrc'
  [string]$desPath = 'C:\folderDes'

# Example 1
# ----------
# This works - note how $option1 contains only '*.*'
#
  [string]$option1 = '*.*'
  [string]$line = 'RoboCopy  $srcPath  $desPath  $option1'
  Invoke-Expression "$line"

# Example 2:
# ----------
# This doesn't work - after '/MIR' is added to the option, RoboCopy seems to choke on the forward slash in '/MIR'
#
  [string]$option2 = '*.* /MIR'
  [string]$line = 'RoboCopy  $srcPath  $desPath  $option2'
  Invoke-Expression "$line"

【问题讨论】:

  • 在我的问题中,示例 1 有效,但示例 2 无效。唯一的区别是 $option1 = '*.*' 和 $option2 = '*.* /MIR'
  • 我不认为存在变量扩展问题,因为如果变量没有正确扩展,示例 1 将不起作用
  • 首先请edit your question,不要添加cmets尝试修改。其次,正如您在对 Christopher G. Lewis 的回答中所分享的那样,知道这是一个解释器而不是直接的 PowerShell,我认为这是您的解释器而不是 PowerShell 本身的问题。看起来解释器没有正确处理斜线。
  • 停止解析的运算符在这里可能对您有用:--% ss64.com/ps/stop-parsing.html

标签: powershell robocopy


【解决方案1】:

我发现这(使用双 InvokeExpression)有效:

  [string]$srcPath = 'C:\folderSrc'
  [string]$desPath = 'C:\folderDes'
  [string]$option = '*.* /MIR'
  [string]$line = 'Invoke-Expression  "RoboCopy  $srcPath  $desPath  $option"'

  Invoke-Expression "$line"

但无法解释为什么这(使用单个 Invoke-Expression)也有效:

  [string]$srcPath = 'C:\folderSrc'
  [string]$desPath = 'C:\folderDes'
  [string]$option = '*.*'
  [string]$line = 'RoboCopy  $srcPath  $desPath  $option'

  Invoke-Expression "$line"

请注意,这两种情况的唯一区别是 $option 变量:

 '*.*'  vs.  '*.* /MIR'

这样的前后矛盾真是令人沮丧……

【讨论】:

    【解决方案2】:

    Powershell 在使用单引号时不会扩展 $variables。

    这里使用双引号:

    [string]$line = "RoboCopy  $srcPath  $desPath  $option1"
    

    不使用 Invoke-Expression 可能更有意义

     RoboCopy.exe  $srcPath  $desPath  *.* /MIR
    

    应该工作

    【讨论】:

    • 我需要 Invoke-Expression,因为这实际上是 PowerShell 脚本的解释器,其中解释器读取 PowerShell 脚本的文本文件并逐行执行脚本
    • 我不太清楚你的意思。探索每个 [string]$line 命令上的双引号
    • 谢谢,克里斯。我会再玩一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-04-05
    • 2014-07-08
    相关资源
    最近更新 更多