当前位置: 首页 > 知识库问答 >
问题:

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

裘光启
2023-03-14

使用以下示例:

$test = '{ }' | ConvertFrom-Json

如何检测$test为空?

不工作:

$test -eq $null
-not $test

这确实有效,但感觉不对:

$test.ToString() -eq ''

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

共有3个答案

梁丘权
2023-03-14

使用字符串测试

$Test = '{ }' | ConvertFrom-Json

$Test -eq $Null
$Null -eq $Test
$Test -eq ''
''
'' -eq $Test
[string]::IsNullOrEmpty($Test)
[string]::IsNullOrWhiteSpace($Test)

输出

False
False
False

True
True
True
郑博
2023-03-14

可能更贵,但不那么晦涩;正在使用本机< code>Get-Member cmdlet:

[Bool]($Test | Get-Member -MemberType NoteProperty)

请注意,$Test不应$Null(而不是空对象),否则将产生错误(与$Null上使用方法一样)。为避免这种情况,您还可以考虑使用:

$Test -and ($Test | Get-Member -MemberType NoteProperty)
欧奇希
2023-03-14

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

# Returns $True, if custom object $test is empty, i.e. has no properties
-not "$test"

注意:-不$test。ToString() 应该是等效的,但目前(从 PowerShell 核心 6.1 开始)由于一个错误,不是。存在 bug 时,任何 [伪对象] 实例都会从中返回空字符串。Tostring().
另一种解决方法是使用 .psobject。Tostring().

只有空(无属性)自定义对象字符串绑定到可扩展字符串中的空字符串,在PowerShell中将空字符串强制转换为布尔值会产生< code>$False,而任何非空字符串都会产生< code>$True。

另一种方法是与空字符串进行比较作为LHS,它隐式地强制RHS上的[伪对象]被字符串化:

# NOTE: Works ONLY with '' on the LHS.
'' -eq $test

概念上更清晰的方法,尽管它依赖于隐藏的<code>。psobject属性PowerShell添加到所有对象,包含反射信息:

0 -eq @($test.psobject.Properties).Count

注意需要使用@(…)来强制枚举属性,以便对其进行计数-参见下一节。

上述方法很方便,但如果$test是一个具有许多属性的大型对象,它可能会很昂贵——尽管从绝对角度来看,这在实践中可能很少重要。

一个更便宜但更晦涩的解决方案是访问 .psobject。不枚举其所有成员的属性集合:

# Returns $true, if $test has no properties
-not $test.psobject.Properties.GetEnumerator().MoveNext()

.psobject。属性集合显然是惰性枚举的,因此没有。Count属性;使用.GetEnumerator()。因此,MoveNext()是一种将枚举限制为第一个属性(如果有的话)的方法。

至于你所尝试的:

$test -eq $null

$test仍然是一个对象,即使它碰巧没有属性,并且一个对象根据定义永远不会$null

-not $test

PowerShell的隐式到布尔的转换将任何< code>[pscustomobject]实例都视为< code>$True,无论它是否碰巧具有属性。例如,< code >[bool]([pscustomobject]@ { })得出< code>$True。

要了解其他数据类型如何被强制为布尔值,请参见以下答案。

 类似资料:
  • 每当我尝试注册并点击注册按钮时,我都会遇到这种类型的空值检查运算符的问题。我收到了这个错误消息 ══════ 异常捕获手势 ════════════════════ 在处理手势时引发了以下_CastError:对空值使用空检查运算符 当抛出异常时,这是堆栈 #0\u授权状态。建筑包装:gr_空间/屏幕/配置文件_屏幕。省道:244 #1(香港)地产_handleTap包装:颤振/材料/墨水井。省道

  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 问题内容: 我从jls找到了报价: 相等运算符可用于比较两个可转换(第5.1.8节)为数字类型的操作数,或两个boolean或Boolean类型的操作数,或 两个分别为引用类型或null类型的操作数 。所有其他情况都会导致编译时错误。 但是这段代码 每个操作数都是参考! 说这是不兼容的类型。 jls在哪里说这些类型应该兼容? 问题答案: 在15.21.3节(参考相等运算符==和!=)中: 如果无法

  • 我找到了JLS引文: 表示它是不兼容的类型。 在jls中哪些地方说这些类型应该兼容?

  • 为什幺应该使用流 在node中,I/O都是异步的,所以在和硬盘以及网络的交互过程中会涉及到传递回调函数的过程。你之前可能会写出这样的代码: var http = require('http'); var fs = require('fs'); var server = http.createServer(function (req, res) { fs.readFile(__dirname