我使用powershell导入包含有关书籍信息的csv文件。喜欢:标题,idnum,作者等...我试图比较每个属性,看它是否等于""或者为null。所以我拥有的是:
Import-Csv C:\location.csv | Foreach-Object{
foreach($property in $_.PSObject.Properties)
{
if($Property -eq "")
{
Write-Host yes
}
}
}
我知道只是说--eq""并不总是适用于空值,但问题是即使我把-eq" Gooden"和Gooden确实在列表中存在多次,if语句也不能正常工作。没有任何财产等于"古登"
答案 0 :(得分:1)
您应首先使用以下属性名称:
Import-Csv C:\location.csv | Foreach-Object {
$a=$_;
$_.Psobject.properties | % {
if ($a.$($_.name)-eq 0){
Write-Host "$($_.name) is 0"}
}
}
答案 1 :(得分:1)
如果你需要确定该属性是否为null,那么PowerShell就有一个内置的可用性来进行比较,就像这样。
此外,您需要使用引号才能使用Write-Host,因此以下是如何查看属性是否为null的示例,如果是,请将该属性的名称写入屏幕。
If ($property.Value -eq $null){
Write-host "$($property.Name) - This property is null"}
话虽如此,这是一个奇怪的要求。人们常常问我们如何在Stack上做奇怪的事情,当他们真的需要做一些共同的事情而不是问怎么做。
说到这里,除了这个技术问题之外,你的最终目标是什么?
如果你能详细说明,我或许可以帮助你提供更好的方法。
答案 2 :(得分:1)
我个人会处理它有点慢,如果你正在寻找具有空值或空值的属性,请使用[String]
方法IsNullOrWhitespace()
。我认为RegEx与"^\w*?$"
的匹配和-or $_ -eq $null
会做同样的事情,但这对我来说似乎更干净,为什么重新发明轮子?
现在,您要检查所有属性,还是只检查特定属性?如果要查看任何字段为空的所有条目,您可以执行以下操作:
$AllBooks = import-csv c:\path\to\file.csv
$Props = $AllBooks[0] | Get-Member -MemberType Properties | Select -Expand Name
ForEach($Book in $AllBooks){
If(($Props | Where{[String]::IsNullOrWhiteSpace($Book.$_)}).Count -gt 0){$Book}
}
如果您不关心空格条目,可以使用更快的IsNullOrEmpty()
,或者[String]:IsNullOrEmpty($Book.$_.Trim())
删除任何空格。
该代码将导入CSV,从第一个条目中收集可能属性的列表(使用导入的CSV,所有记录应具有相同的属性,因此这应该是安全的)。然后,对于每个记录,它将循环显示属性列表,并检查它们中的任何一个是否为该记录为空,如果是,则输出记录。如果您想收集这些条目,您可以只收集变量中的整个ForEach
循环。类似的东西:
$BadEntries = ForEach($Book in $AllBooks){
然后你就可以使用$ BadEntries。
如果你只关心一个字段,请说“标题”,这变得非常简单......
$AllBooks | Where{[string]::IsNullOrEmpty($_.Title.Trim())}