Powershell导入CSV的问题

Powershell导入CSV的问题,powershell,Powershell,主脚本 $Computers = Get-Content .\computers.txt If ( test-path .\log.txt ) { $Log_Successful = Import-CSV .\log.txt | Where-Object {$_.Result -eq "Succesful"} } ELSE { Add-Content "Computer Name,Is On,Attempts,Result,Time,Date" } $Log_Successfu

主脚本

$Computers = Get-Content .\computers.txt

If ( test-path .\log.txt ) {
    $Log_Successful = Import-CSV .\log.txt | Where-Object {$_.Result -eq "Succesful"}
} ELSE {
    Add-Content "Computer Name,Is On,Attempts,Result,Time,Date"
}
$Log_Successful | format-table -autosize
问题:

Log_成功。“计算机名”工作正常,但如果我将4改为如下内容

$Log_Successful = Import-CSV .\log.txt | Where-Object {$_.Result -eq "Failed"}
登录成功。“计算机名”不再有效。。。你知道为什么吗

数据集

Computer Name,Is On,Attempts,Result,Time,Date
52qkkgw-94210jv,False,1,Failed,9:48 AM,10/28/2012
HELLBOMBS-PC,False,1,Successful,9:48 AM,10/28/2012
52qkkgw-94210dv,False,1,Failed,9:48 AM,10/28/2012

我不确定这是否是问题所在,但您有一个输入错误,您将对象与“Successful”进行比较,文件中的值为“Successful”(缺少的)

无论如何,什么不起作用?

如果“成功”,将返回单个对象。它包含属性“计算机名”。如果“失败”,则返回两个对象的数组。它(数组本身)不包含属性“计算机名”。在PowerShell v3中,在某些情况下可以使用表示法
$array.SomePropertyOfcContainedObject
,但在PowerShell v2中,这始终是一个错误。这就是你可能看到的

您应该遍历结果对象数组,例如
foreach($log in$log\u Successful){…}
并访问
$log
对象的属性

最后一点提示。为了确保
Import Csv
调用的结果始终是一个数组(不是null或单个对象),请使用
@()
运算符

修复后的代码将是:

$logs = @(Import-Csv ... | where ...)
# $logs is an array, e.g. you can use $logs.Count

# process logs
foreach($log in $logs) {
    # use $log."Computer Name"
}

请在每个脚本中使用
Set PSDebug-strict
,以捕获拼写错误的变量。此外,Powershell关键字的常用约定是使用小写。当您使用.Net库中的内容时,如
[Regex]::GetGroupNames()
,更喜欢使用.Net案例
IF{…}ELSE{…}
看起来像SQL,
IF{…}ELSE{}
看起来很奇怪。OMFG我爱你!!!!!非常感谢你,我已经玩了我能想到的每一个组合9个小时了!!谢谢,我会投100票!!