比较powershell中的属性

时间:2015-04-16 19:05:34

标签: powershell csv properties

我使用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语句也不能正常工作。没有任何财产等于"古登"

3 个答案:

答案 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())}