使用以下示例:
$test = '{ }' | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)
如何检测 $test 为空?
不起作用:
$test -eq $null
-not $test
Run Code Online (Sandbox Code Playgroud)
这确实有效,但感觉不对:
$test.ToString() -eq ''
Run Code Online (Sandbox Code Playgroud)
这是一个简化的示例,但我的用例是我使用 invoke-restmethod 从 REST api 获得的响应,某些属性作为空 psobjects 返回。
mkl*_*nt0 10
这是[pscustomobject]
通过字符串表示测试空(无属性)自定义对象 ( )的最简单解决方案,但您需要使用可扩展字符串(字符串插值,"..."
)而不是.ToString()
获取它:
# Returns $True, if custom object $test is empty, i.e. has no properties
-not "$test"
Run Code Online (Sandbox Code Playgroud)
注意:-not $test.ToString()
应该是等价的,但目前(从 PowerShell Core 6.1 开始)不是,由于bug。存在错误时,任何 [pscustomobject]
实例都会从返回空字符串.ToString()
。
另一种解决方法是使用.psobject.ToString()
.
只有空的(无属性的)自定义对象会字符串化为可扩展字符串内的空字符串,并在 PowerShell 中将空字符串强制转换为布尔值$False
,而任何非空字符串都会产生$True
。
另一种方法是将一个空字符串作为 LHS进行比较,这隐式强制[pscustomobject]
RHS 上的 被字符串化:
# NOTE: Works ONLY with '' on the LHS.
'' -eq $test
Run Code Online (Sandbox Code Playgroud)
一个概念上更清晰的方法,虽然它依赖于.psobject
PowerShell 添加到所有对象的隐藏属性,包含反射信息:
0 -eq @($test.psobject.Properties).Count
Run Code Online (Sandbox Code Playgroud)
请注意需要使用@(...)
强制枚举属性,以便可以对它们进行计数 - 请参阅下一节。
上述方法很方便,但如果$test
是一个具有许多属性的大对象,它可能会很昂贵——尽管从绝对意义上讲,这在实践中可能很少有影响。
一个更便宜但更模糊的解决方案是访问.psobject.Properties
集合而不枚举其所有成员:
# Returns $true, if $test has no properties
-not $test.psobject.Properties.GetEnumerator().MoveNext()
Run Code Online (Sandbox Code Playgroud)
该.psobject.Properties
集合显然是懒惰的枚举,因此没有.Count
属性;.GetEnumerator().MoveNext()
因此using是一种将枚举限制为第一个属性(如果有)的方法。
至于你尝试了什么:
Run Code Online (Sandbox Code Playgroud)$test -eq $null
$test
仍然是一个对象,即使它碰巧没有属性,并且一个对象根据定义是 never $null
。
Run Code Online (Sandbox Code Playgroud)-not $test
PowerShell 的隐式到布尔转换将任何 [pscustomobject]
实例视为$True
,无论它是否具有属性;例如,[bool] ([pscustomobject] @{})
产量$True
。
要了解如何将其他数据类型强制转换为布尔值,请参阅此答案。
归档时间: |
|
查看次数: |
2029 次 |
最近记录: |