web-dev-qa-db-ja.com

PowerShell文字列のデフォルトのパラメーター値が期待どおりに機能しない

#Requires -Version 2.0

[CmdletBinding()]
Param(
  [Parameter()] [string] $MyParam = $null
)

if($MyParam -eq $null) {
  Write-Host 'works'
} else {
  Write-Host 'does not work'
}

出力は「機能しません」=>文字列が暗黙的にnullから空の文字列に変換されるように見えますか?どうして?そして、文字列が空であるか、本当に$ nullであるかをテストするにはどうすればよいですか?これは2つの異なる値である必要があります!

26
D.R.

さて、答えを見つけました@ https://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/

想定:

Param(
  [string] $stringParam = $null
)

また、パラメーターが指定されていません(デフォルト値を使用しています):

# will NOT work
if ($null -eq $stringParam)
{
}

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

または、特別なnullタイプを指定できます。

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

その場合、$null -eq $stringParamは期待どおりに機能します。

変だ!

29
D.R.

文字列パラメータに$nullを許可する場合は、AllowNull属性を使用する必要があります。

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

比較の左側で$ nullを使用する必要があります

if ($null -eq $MyParam)

予想どおりに動作させたい場合

11
oɔɯǝɹ

[String] :: Emptyとの多くの等価比較を見るには、次のように、[String] :: IsNullOrWhiteSpaceまたは[String] :: IsNullOrEmpty静的メソッドを使用できます。

param(
    [string]$parameter = $null
)

# we know this is false
($null -eq $parameter)

[String]::IsNullOrWhiteSpace($parameter)
[String]::IsNullOrEmpty($parameter)
('' -eq $parameter)
("" -eq $parameter)

生成されるもの:

PS C:\...> .\foo.ps1
False
True
True
True
True
2
Scottley

$ null値を残したい場合は、単にnotを実行して、パラメーターの型を宣言します。

Param(
    $stringParam
)

(タイプを宣言するとき、他のソリューションのどれも私のために機能しませんでした。)

2
argonym

したがって、何らかの理由で、$null型のパラメーターの[string]のデフォルト値は空の文字列にデフォルト設定されているようです。

オプション1

if ($stringParam) { ... }

オプション2

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

オプション3

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