2012-06-13 13 views
6

Tengo un script de PowerShell:PowerShell: Args/params no está poblada

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)") } 

El Write-Host part es para la depuración.
lo ejecuto como .\csvtosql.ps1 mycsv.csv dbo.MyTable (de cáscara de PowerShell), y obtener

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 

me sale exactamente el mismo error con los parámetros que los que paso, también el mismo error si trato de utilizar parámetros con nombre.

¿Qué puede hacer que los parámetros no se pasen?

ACTUALIZACIÓN:. PowerShell ISE me pide estos parámetros utilizando indicaciones GUI, luego me da el mismo error de ellos no se pasa en

Respuesta

2
+0

Ok, '$ args' donde solo para depurar sake, pero tienes razón, no funcionan de todos modos, según las respuestas de los demás. –

+0

Ahora que el '$ input' es especial es el motivo de mi problema. ¡Muchas gracias! –

4

A menos que haya marcado un parámetro con el atributo ValueFromRemainingArguments (indica si el cmdlet el parámetro acepta todos los argumentos restantes de la línea de comandos que están asociados con este parámetro), Args está "deshabilitado". Si todo lo que necesita son los argumentos cuentan llamar a la variable especial:

$PSBoundParameters.Count 
+0

+1 Ok, tienes el acceso directo a la derecha. – JPBlanc

+0

Gracias @JPBlanc :) –

+0

Gracias, eso fue útil para identificar que los parámetros funcionan. Resultó que mi problema era que '$ input' tenía un significado reservado. –

-1

Estás llamando la secuencia de comandos con parámetros de posición (es decir, sin nombre) y PowerShell no sabe cómo les asignan a los parámetros de script. Es necesario que sea llamar a su secuencia de comandos con los nombres de los parámetros:

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

o actualizar la secuencia de comandos para especificar el orden preferido de los parámetros posicionales:

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

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

No es necesario, el valor predeterminado para las posiciones se basa en el orden de la lista 'param'. Mi script realmente funciona sin 'Posición 'siempre que no nombre mis parámetros' $ input'. –

Cuestiones relacionadas