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