gpt4 book ai didi

powershell - 应该使用什么运算符来检测空的 psobject?

转载 作者:行者123 更新时间:2023-12-05 00:11:36 24 4
gpt4 key购买 nike

使用以下示例:

$test = '{ }' | ConvertFrom-Json

如何检测 $test 为空?

不起作用:
$test -eq $null
-not $test

这确实有效,但感觉不对:
$test.ToString() -eq ''

这是一个简化的示例,但我的用例是我使用 invoke-restmethod 从 REST api 获得的响应,某些属性作为空 psobjects 返回。

最佳答案

这是通过字符串表示 测试空的(无属性)自定义对象 ( [pscustomobject] ) 的最简单解决方案,但是 您需要使用可扩展的字符串(字符串插值,"...")而不是 .ToString()获得它:

# Returns $True, if custom object $test is empty, i.e. has no properties
-not "$test"
注: -not $test.ToString()应该是等价的,但目前(从 PowerShell Core 6.1 开始)不是,因为 bug .如果存在错误,任何 [pscustomobject]实例从 .ToString() 返回空字符串.
另一种解决方法是使用 .psobject.ToString() .
只有空的(无属性的)自定义对象会在可扩展字符串中字符串化为空字符串,并且在 PowerShell 中将空字符串强制为 bool 值会产生 $False , 而任何非空字符串都会产生 $True .
另一种方法是与作为 LHS 的空字符串进行比较,这隐式强制 [pscustomobject]在 RHS 上进行字符串化:
# NOTE: Works ONLY with '' on the LHS.
'' -eq $test
A 概念上更清晰的方法 ,虽然它依赖于隐藏的 .psobject属性 PowerShell 添加到所有对象,包含反射信息:
0 -eq @($test.psobject.Properties).Count
注意需要使用 @(...)强制枚举属性,以便可以对它们进行计数 - 请参阅下一节。
以上方法很方便,但是如果 $test是一个具有许多属性的大对象,它可能很昂贵——尽管从绝对意义上讲,这在实践中可能很少有影响。

A 更便宜但更模糊的解决方案 是访问 .psobject.Properties不枚举其所有成员的集合:
# Returns $true, if $test has no properties
-not $test.psobject.Properties.GetEnumerator().MoveNext()
.psobject.Properties集合显然是懒惰的枚举,因此没有 .Count属性(property);使用 .GetEnumerator().MoveNext()因此是一种将枚举限制为第一个属性(如果有)的方法。

至于 你试过什么 :
$test -eq $null
$test仍然是一个对象,即使它碰巧没有属性,而且根据定义,对象永远不会 $null .
-not $test

PowerShell 的隐式到 bool 转换处理任何 [pscustomobject]实例为 $True ,是否碰巧有属性;例如, [bool] ([pscustomobject] @{}) yield $True .
要了解如何将其他数据类型强制转换为 bool 值,请参阅 this answer .

关于powershell - 应该使用什么运算符来检测空的 psobject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53181472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com