使用以下示例:
$test = '{ }' | ConvertFrom-Json
如何检测$test为空?
不工作:
$test -eq $null
-not $test
这确实有效,但感觉不对:
$test.ToString() -eq ''
这是一个简化的示例,但我的用例是我使用invoke-restmethod从REST api获得的响应,某些属性作为空psobject返回。
使用字符串测试
$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
可能更贵,但不那么晦涩;正在使用本机< code>Get-Member cmdlet:
[Bool]($Test | Get-Member -MemberType NoteProperty)
请注意,$Test
不应$Null
(而不是空对象),否则将产生错误(与$Null
上使用方法一样)。为避免这种情况,您还可以考虑使用:
$Test -and ($Test | Get-Member -MemberType NoteProperty)
这是通过字符串表示测试空(无属性)自定义对象(< 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