以下代码
"a,b,c
1,1,1
2,,2
3,3,3" > test.csv
import-csv test.csv | select b | % {
Write-Host "$_ $([string]::IsNullOrEmpty($_))"
}
返回
@{b=1} False @{b=} False @{b=3} False
但是,我希望第二行返回True
。我尝试了$_ -eq $null -or $_ -eq ''
,如果它们有效,则没有?
答案 0 :(得分:2)
问题是% { }
块$_
内部不包含列b
的值,而是包含b
属性的对象。当您运行[string]::IsNullOrEmpty($_)
时,您正在测试此对象是否为null或空字符串,两者都不是真的。
为了说明发生了什么,比较......的结果
Import-Csv .\test.csv | Get-Member
......结果......
Import-Csv .\test.csv | select b | Get-Member
......结果......
Import-Csv .\test.csv | select -ExpandProperty b | Get-Member
一种解决方案是测试b
(而不是对象本身)生成的对象的select
属性是空还是空:
import-csv test.csv | select b | % {
Write-Host "$_ $([string]::IsNullOrEmpty($_.b))"
}
另一种解决方案是仅将列b
的值传递给% { }
块:
import-csv test.csv | select -ExpandProperty b | % {
Write-Host "$_ $([string]::IsNullOrEmpty($_))"
}
答案 1 :(得分:0)
我发现以下代码有效。
import-csv test.csv | select b | % {
Write-Host "$_ $($_.b -eq '')"
}
还有其他解决方案吗?
答案 2 :(得分:0)
在问题的示例中,仍然存在一个带有空b
参数的对象。请考虑以下内容,说明您获得结果的原因。
PS C:\Users\matt> @{} -eq $null
False
剩下的就是扩展属性,就像在Bacon's answer
中一样