2012-06-13 9 views
6

Ho uno script PowerShell:PowerShell: Args/params non essere popolato

param (
    [Parameter(Mandatory=$true)][string]$input, 
    [Parameter(Mandatory=$true)][string]$table 
) 

Write-Host "Args:" $Args.Length 
Get-Content $input | 
    % { [Regex]::Replace($_, ",(?!NULL)([^,]*[^\d,]+[^,]*)", ",'`$1'") } | 
    % { [Regex]::Replace($_, ".+", "INSERT INTO $table VALUES (`$1)") } 

Il Write-Host part è per il debug.
corro come .\csvtosql.ps1 mycsv.csv dbo.MyTable (da shell powershell), e ottenere

Args: 0 
Get-Content : Cannot bind argument to parameter 'Path' because it is an empty s 
tring. 
At C:\temp\csvtosql.ps1:7 char:12 
+ Get-Content <<<< $input | 
    + CategoryInfo   : InvalidData: (:) [Get-Content], ParameterBinding 
    ValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAl 
    lowed,Microsoft.PowerShell.Commands.GetContentCommand 

ottengo esattamente lo stesso errore con i parametri che mi passano, anche lo stesso errore se si tenta di utilizzare parametri denominati.

Cosa può causare il mancato passaggio dei parametri?

UPDATE:. PowerShell ISE mi chiede per questi parametri utilizzando i prompt GUI, poi mi dà lo stesso errore su di loro non essere passata in

risposta

2
+0

Ok, '$ args' dove solo per il debug del sake, ma hai ragione, non funzionano comunque, come per le risposte degli altri. –

+0

Ora il '$ input' è speciale è la ragione del mio problema. Molte grazie! –

4

A meno che non hai segnato un parametro con l'attributo ValueFromRemainingArguments (indica se il cmdlet parametro accetta tutti gli argomenti della riga di comando rimanenti associati a questo parametro), Args è "disabilitato". Se tutto ciò che serve è gli argomenti contano chiamare la variabile speciale:

$PSBoundParameters.Count 
+0

+1 Ok, hai la scorciatoia giusta. – JPBlanc

+0

Grazie @JPBlanc :) –

+0

Grazie, è stato utile per identificare i parametri che funzionano. Come si è scoperto, il mio problema era con '$ input' che aveva un significato riservato. –

-1

Stai chiamando lo script con i parametri posizionali (vale a dire senza nome) e PowerShell non sa come li mappa ai parametri di script. È necessario sia chiamare lo script utilizzando i nomi dei parametri:

.\csvtosql.ps1 -input mycsv.csv -table dbo.MyTable 

o aggiornare lo script per specificare l'ordine preferito di parametri posizionali:

param (
    [Parameter(Mandatory=$true,Position=0)] 
    [string] 
    $input, 

    [Parameter(Mandatory=$true,Position=1)] 
    [string] 
    $table 
) 
+0

Non è necessario, l'impostazione predefinita per le posizioni è basata sull'ordine nella lista 'param'. Il mio script funziona in realtà senza 'Position' a patto che non nomino i miei parametri' $ input'. –

Problemi correlati