2011-06-19 11 views
25

Por favor, intente esto:Cómo validar los parámetros de función de PowerShell que permiten cadenas vacías?

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    [string] 
    $Text 
    ) 
    $text 
} 

function f2 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    #[string] 
    $Text 
    ) 
    $text 
} 

function f3 
{ 
    param(
    [Parameter(Mandatory=$False,ValueFromPipelineByPropertyName=$true)] 
    [string] 
    $Text 
    ) 
    $text 
} 

f1 '' 
f2 '' 
f3 '' 

Aquí f1 genera un error. Ahora intente

f2 $null 
f3 $null  

Esta vez solo f2 arroja un error. Lo que quiero es una función f, de modo que

f '' # is accepted 
f $null # returns an error 
+2

+1 para una buena pregunta. –

+0

Lo siento, no entiendo, su función 'f2' funciona como quiera. f2 '' es aceptado y f2 $ null genera un error. – JPBlanc

+0

@JPB Creo que el problema es sobre el tipo de datos. –

Respuesta

45

Los bloques atributo obligatorio valores nulos y vacíos y le pide un valor. para permitir valores vacíos (incluyendo nulo) agregar el atributo parámetro AllowEmptyString:

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    [AllowEmptyString()] 
    [string]$Text 
    ) 
    $text 
} 
+0

Tu versión es mejor que la de Roman Kuzmin, rechaza cadenas como f1 @ (1, 2). El hecho de que f1 $ null sea aceptado parece ser el problema más leve. Por cierto, esto es casi idéntico a f3. –

+0

Intente reemplazar AllowEmptyString con ValidateNotNull. permite cadenas vacías pero no nulos. –

+0

No, ValidateNotNull() falla para f1 ''. –

6

Aquí está la solución que se ajusta a los requisitos con una advertencia.

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    $Text 
    ) 
    Write-Host 'Working' 
    $text 
} 

f1 '' 
f1 $null 

Salida:

Working 
f1 : Cannot bind argument to parameter 'Text' because it is null. 

Advertencia

Con el fin de adaptarse a las necesidades que tenemos para omitir la declaración de tipo explícito de [string]. El problema es que PowerShell tiende a convertir valores nulos en cadenas vacías donde se especifica el tipo [string]. Por lo tanto, si usamos la declaración de tipo, entonces el valor nulo en realidad nunca llega a la función.

P.S. Aquí se presenta un problema relacionado: It isn't possible to pass null as null into a .NET method that has a parameter of type String

+0

Acabo de darme cuenta de que esta es exactamente la 'función f2'. Entonces, esa no es una verdadera respuesta, tal vez :) –

+1

+1 Eso es lo que estoy diciendo desde el principio; o) Pero tú das la explicación, tú eres el tipo. – JPBlanc

1

Sólo por el mayor abundamiento, si desea que su entrada se valida con tipo de cadena, puede hacerlo después de declaración parámetros:

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    $Text 
    ) 
    if (!($text -eq '') -and !($text -as [string])) {write-host "wrong type"; return } 
    $text 
} 

Esta función se comporta como sigue:

  • Lanza "no se puede enlazar argumento .." excepción cuando la entrada es $null
  • pases cuando la entrada es un vacío
  • cadena
  • salidas con mensaje equivocado tipo cuando la entrada no es una cadena
Cuestiones relacionadas