2013-06-11 13 views
9

Piszę skrypt PowerShell, który jest opakowaniem dla .exe. Chcę mieć opcjonalne parametry skryptów i przekazać resztę bezpośrednio do exe. Oto skrypt testowy:Akceptowanie opcjonalnego parametru tylko jako nazwanego, bez położenia

param (
    [Parameter(Mandatory=$False)] [string] $a = "DefaultA" 
    ,[parameter(ValueFromRemainingArguments=$true)][string[]]$ExeParams # must be string[] - otherwise .exe invocation will quote 
) 

Write-Output ("a=" + ($a) + " ExeParams:") $ExeParams 

Jeśli biegnę z nazwanego param, wszystko jest super:

C:\ > powershell /command \temp\a.ps1 -a A This-should-go-to-exeparams This-also 
a=A ExeParams: 
This-should-go-to-exeparams 
This-also 

Jednakże, jeśli staram się pomijać moje param, pierwsza nienazwana param jest przypisany do niego :

C:\ > powershell /command \temp\a.ps1 This-should-go-to-exeparams This-also 
a=This-should-go-to-exeparams ExeParams: 
This-also 

spodziewałbym:

a=DefaultA ExeParams: 
This-should-go-to-exeparams 
This-also 

Próbowałem dodać Position=0 do parametru, ale to daje taki sam wynik.

Czy istnieje sposób, aby to osiągnąć?
Może inny schemat parametrów?

Odpowiedz

7

Domyślnie wszystkie parametry funkcji są pozycyjne. Windows PowerShell przypisuje numery pozycji do parametrów w kolejności, w której parametry są zadeklarowane w funkcji. Aby wyłączyć tę funkcję, ustaw wartość argumentu PositionalBinding atrybutu CmdletBinding na $False.

spojrzeć at How to disable positional parameter binding in PowerShell

function Test-PositionalBinding 
{ 
    [CmdletBinding(PositionalBinding=$false)] 
    param(
     $param1,$param2 
    ) 

    Write-Host param1 is: $param1 
    Write-Host param2 is: $param2 
} 
+0

Tak, to załatwia sprawę. Dzięki! – Jonathan

+0

Nie mogę uruchomić tego w Powershell 2.0 - czy jest to oczekiwane? – bacar

+0

Nie sądzę, żeby to działało w Powershell 2.0 (blog, do którego link jest podłączony, mówi, że nie, i odnosi się do [tego obejścia] (http://social.technet.microsoft.com/Forums/windowsserver/en-US/ abbc587f-cd7e-4c8d-879f-355339d9d6b7/named-parameters-not-working-as-expected? forum = winserverpowershell # cf01c476-1831-4270-b462-ac7612240a56)) – ernie

Powiązane problemy