2015-09-26 151 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,大多數人用功能來犯這個錯誤。 –