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!

23
demandé sur EpicPandaForce 2014-04-07 11:51:18

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!

28
répondu D.R. 2017-07-19 22:58:51

, 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

10
répondu oɔɯǝɹ 2016-05-13 10:58:51

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) { ... }
1
répondu angularsen 2015-06-04 11:41:50

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
1
répondu Scottley 2016-08-17 00:53:15

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.)

1
répondu argonym 2017-02-16 18:28:32