2

主要脚本

$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_Successful."Computer Name" 工作正常,但如果我将 4 更改为如下所示

$Log_Successful = Import-CSV .\log.txt | Where-Object {$_.Result -eq "Failed"}

Log_Successful.“计算机名”不再起作用...任何想法为什么?

数据集

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
4

2 回答 2

3

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

您应该遍历结果对象数组,例如foreach($log in $Log_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"
}
于 2012-10-28T07:18:06.543 回答
0

我不确定这是否是问题所在,但您有错字,在 Where-Object 中您与“成功”进行比较,文件中的值为“成功”(缺少“s”)。

无论如何,什么不工作?

于 2012-10-28T06:39:28.227 回答