#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つの異なる値である必要があります!
さて、答えを見つけました@ 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
は期待どおりに機能します。
変だ!
文字列パラメータに$null
を許可する場合は、AllowNull
属性を使用する必要があります。
[CmdletBinding()]
Param (
[Parameter()]
[AllowNull()]
[string] $MyParam
)
if ($null -eq $MyParam)
予想どおりに動作させたい場合
[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
$ null値を残したい場合は、単にnotを実行して、パラメーターの型を宣言します。
Param(
$stringParam
)
(タイプを宣言するとき、他のソリューションのどれも私のために機能しませんでした。)
したがって、何らかの理由で、$null
型のパラメーターの[string]
のデフォルト値は空の文字列にデフォルト設定されているようです。
オプション1
if ($stringParam) { ... }
オプション2
if ($stringParam -eq "") { ... }
オプション3
if ($stringParam -eq [String]::Empty) { ... }