Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较powershell中的属性_Powershell_Csv_Properties - Fatal编程技术网

比较powershell中的属性

比较powershell中的属性,powershell,csv,properties,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

我正在使用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语句也不起作用。任何属性都不等于“Gooden”

您应该首先使用如下属性名称:

Import-Csv C:\location.csv | Foreach-Object {
  $a=$_;
  $_.Psobject.properties | % {
     if ($a.$($_.name)-eq 0){
       Write-Host "$($_.name) is 0"}
     }
  }

如果您需要确定该属性是否为null,PowerShell有一个内置的vriable,用于进行类似于此的比较

此外,为了使用Write Host,您需要使用引号,因此下面是一个示例,说明如何查看属性是否为null,如果为null,请将属性的名称写入屏幕

If ($property.Value -eq $null){
    Write-host "$($property.Name) - This property is null"}
话虽如此,你提出的要求却很奇怪。当人们真的需要做一些普通的事情时,他们经常问我们如何在堆栈上做一些奇怪的事情,而不是问如何去做

话虽如此,除了这个技术问题之外,你的最终目标是什么


如果您能详细说明,我可能可以帮助您找到更好的方法。

我个人会稍微慢一点,如果您要查找具有空值或空值的属性,可以使用
[String]
方法
IsNullOrWhitespace()
。我想正则表达式匹配
“^\w*?$”
或$\ueq$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}
}
$BadEntries = ForEach($Book in $AllBooks){
如果您不关心属于空白的条目,则可以使用速度更快的
IsNullOrEmpty()
,也可以执行
[String]:IsNullOrEmpty($Book.$\u.Trim())
删除任何空白

该代码将导入CSV,从第一个条目中收集可能的属性列表(对于导入的CSV,所有记录都应具有相同的属性,因此这应该是安全的)。然后,对于每个记录,它将循环属性列表,并检查该记录是否有任何属性为空,如果为空,则输出该记录。如果您想收集这些条目,您可以在变量中收集整个
ForEach
循环。比如:

$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}
}
$BadEntries = ForEach($Book in $AllBooks){
然后,您将有$BadEntries可供使用

如果你只关心一个领域,比如“标题”,这就变得非常简单

$AllBooks | Where{[string]::IsNullOrEmpty($_.Title.Trim())}

我试图计算在整个csv中有多少空值,我认为这是最好的方法,通过遍历每个字段