2015-09-26 134 views
0

所以我正在构建一个菜单,并希望将一个数组作为参考传递给一个函数。 当我通过参考一切工作正常。但是当我想传递第二个参数时,它将不会与“ParameterBindingArgumentTransformationException”一起使用。我不明白为什么。 这里是 - working-最少的代码:PowerShell传递数组作为参考

function Menu { 
    param([Ref]$mi) 
    write-host "var" 
    write-host $mi.value[0].cmd 
    write-host $mi.value[1].desc 
    write-output 0 
} 


function MainMenu { 
      $mm = @( @{desc='Windows Tools';cmd='WinToolsMenue'}, 
         @{desc='copy setup.exe';cmd='setupexe'}, 
         @{desc='gpupdate (Policy)';cmd='cmd /c gpupdate /force'}, 
         @{desc='Exit';cmd='break'}) 
       $a = Menu ([Ref]$mm) 
    } 

& MainMenu 

问题代码:

function Menu { 
      param([Ref]$mi, $b) 
      write-host $b 
      write-host $mi.value[0].cmd 
      write-host $mi.value[1].desc 
      write-output 0 
     } 

function MainMenu { 

      $mm = @( @{desc='Windows Tools';cmd='WinToolsMenue'}, 
         @{desc='copy setup.exe';cmd='setupexe'}, 
         @{desc='gpupdate (Policy)';cmd='cmd /c gpupdate /force'}, 
         @{desc='Exit';cmd='break'}) 
      $mm 

      $a = Menu ([Ref]$mm, "b") 
} 

& MainMenu 

几乎尝试([参考文献] $英里),$ B或([参考文献] $ MI,$ b),但它不起作用。有人知道我做错了什么?

回答

1
$a = Menu ([Ref]$mm, "b") 

这不是你如何调用函数。请记住,逗号是数组的运算符,圆括号表示首先得到评估的表达式。这不会因为你正在调用一个函数而改变。这是说,“呼叫功能Menu,与第一参数与[Ref]$mm两个元素和"b"数组从本质上讲,你打电话这一点:

$a = Menu -mi @([Ref]$mm, "b") -b $null 

您需要指定:

$a = Menu ([Ref]$mm) "b" 

或者:

$a = Menu -mi ([Ref]$mm) -b "b" 
+0

好吧,明白了。谢谢您的回复。参考文献需要评估,逗号是数组分隔符,那是我的错。请记住这个 – Magomic

+0

@Magomic这不是关于过错,男人。我只是解释一下PowerShell的所见所闻。像“foreach”和“param”这样的语言结构使情况变得更糟。 IMX,大多数人用功能来犯这个错误。 –