powershell powershell-v4.0

El valor predeterminado del parámetro de cadena de PowerShell no funciona como se esperaba



powershell-v4.0 (5)

#Requires -Version 2.0 [CmdletBinding()] Param( [Parameter()] [string] $MyParam = $null ) if($MyParam -eq $null) { Write-Host ''works'' } else { Write-Host ''does not work'' }

Las salidas "no funciona" => parece que las cadenas se convierten de forma nula en una cadena vacía implícitamente? ¿Por qué? ¿Y cómo probar si una cadena está vacía o realmente $ nula? ¡Esto debería ser dos valores diferentes!


Bien, encontré la respuesta @ https://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/

Asumiendo:

Param( [string] $stringParam = $null )

Y el parámetro no se especificó (está usando el valor predeterminado):

# will NOT work if ($null -eq $stringParam) { } # WILL work: if ($stringParam -eq "" -and $stringParam -eq [String]::Empty) { }

Alternativamente, puede especificar un tipo nulo especial:

Param( [string] $stringParam = [System.Management.Automation.Language.NullString]::Value )

En cuyo caso, $null -eq $stringParam funcionará como se esperaba.

¡Extraño!


Necesitará usar el atributo AllowNull si desea permitir $null para los parámetros de cadena:

[CmdletBinding()] Param ( [Parameter()] [AllowNull()] [string] $MyParam )

Y tenga en cuenta que spcaf.com/blog/powershell-null-comparison :

if ($null -eq $MyParam)

si quieres que funcione predeciblemente


Por lo tanto, parece que el valor predeterminado de $null para los parámetros de tipo [string] cadena vacía, por cualquier motivo.

Opción 1

if ($stringParam) { ... }

opcion 2

if ($stringParam -eq "") { ... }

Opcion 3

if ($stringParam -eq [String]::Empty) { ... }


Simplemente no declare el tipo de parámetro si desea que permanezca un valor $ null:

Param( $stringParam )

(Ninguna de las otras soluciones funcionó para mí al declarar el tipo.)


viendo muchas comparaciones de igualdad con [String] :: Empty, puede usar los métodos estáticos [String] :: IsNullOrWhiteSpace o [String] :: IsNullOrEmpty, como los siguientes:

param( [string]$parameter = $null ) # we know this is false ($null -eq $parameter) [String]::IsNullOrWhiteSpace($parameter) [String]::IsNullOrEmpty($parameter) ('''' -eq $parameter) ("" -eq $parameter)

cuyos rendimientos:

PS C:/...> ./foo.ps1 False True True True True