PowerShell chaîne valeur du paramètre par défaut ne fonctionne pas comme prévu
#Requires -Version 2.0
[CmdletBinding()]
Param(
[Parameter()] [string] $MyParam = $null
)
if($MyParam -eq $null) {
Write-Host 'works'
} else {
Write-Host 'does not work'
}
Outputs "ne fonctionne pas" = > on dirait que les chaînes sont converties de null en chaîne vide implicitement? Pourquoi? Et comment tester si une chaîne est vide ou vraiment $null? Cela devrait être deux valeurs différentes!
5 réponses
Ok, trouvé la réponse @ https://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/
En supposant:
Param(
[string] $stringParam = $null
)
Et le paramètre n'a pas été spécifié (utilise la valeur par défaut):
# will NOT work
if ($null -eq $stringParam)
{
}
# WILL work:
if ($stringParam -eq "" -and $stringParam -eq [String]::Empty)
{
}
Vous pouvez également spécifier un type nul spécial:
Param(
[string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)
Auquel cas le $null -eq $stringParam
fonctionnera comme prévu.
Bizarre!
, Vous devrez utiliser le AllowNull
attribut si vous souhaitez autoriser $null
pour les paramètres de chaîne:
[CmdletBinding()]
Param (
[Parameter()]
[AllowNull()]
[string] $MyParam
)
Et notez que vous devriez utiliser $ null Sur le côté gauche de la comparaison:
if ($null -eq $MyParam)
Si vous voulez que cela fonctionne de manière prévisible
Il semble donc une valeur par défaut de $null
pour les paramètres de type [string]
par défaut à la chaîne vide, pour une raison quelconque.
Option 1
if ($stringParam) { ... }
Option 2
if ($stringParam -eq "") { ... }
Option 3
if ($stringParam -eq [String]::Empty) { ... }
En voyant de nombreuses comparaisons d'égalité avec [String]:: Empty, vous pouvez utiliser les méthodes statiques [String]:: IsNullOrWhiteSpace ou [String]:: IsNullOrEmpty, comme suit:
param(
[string]$parameter = $null
)
# we know this is false
($null -eq $parameter)
[String]::IsNullOrWhiteSpace($parameter)
[String]::IsNullOrEmpty($parameter)
('' -eq $parameter)
("" -eq $parameter)
Qui donne:
PS C:\...> .\foo.ps1
False
True
True
True
True
Faites simplement pas déclarer le type du paramètre si vous voulez qu'une valeur $null reste:
Param(
$stringParam
)
(Aucune des autres solutions n'a fonctionné pour moi lors de la déclaration du type.)