2013-06-11 15 views
9

Sto scrivendo uno script PowerShell che è un wrapper di un file .exe. Voglio avere alcuni parametri di script opzionali e passare il resto direttamente all'exe. Ecco uno script di test:Accettazione di un parametro opzionale solo come indicato, non posizionale

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 

Se corro con il un parametro di nome, tutto è grande:

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 

Tuttavia, se provo a omettere il mio param, il primo parametro senza nome viene assegnato ad esso :

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

mi si aspetterebbe:

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

Ho provato ad aggiungere Position=0 al parametro, ma questo produce lo stesso risultato.

C'è un modo per raggiungere questo obiettivo?
Forse uno schema di parametri diverso?

risposta

7

Per impostazione predefinita, tutti i parametri di funzione sono posizionali. Windows PowerShell assegna i numeri di posizione ai parametri nell'ordine in cui i parametri sono dichiarati nella funzione. Per disabilitare questa funzione, impostare il valore dell'argomento PositionalBinding dell'attributo CmdletBinding su $False.

uno sguardo 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

Yep, che fa il trucco. Grazie! – Jonathan

+0

Non riesco a farlo funzionare in Powershell 2.0 - è previsto? – bacar

+0

Non penso che funzioni in Powershell 2.0 (il post di blog collegato dice che non funziona e fa riferimento a [questa soluzione] (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

Problemi correlati