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。"ComputerName"は正常に機能しますが、4を変更して次のように読み取ると

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

Log_Successful。"ComputerName"は機能しなくなりました...理由は何ですか?

データセット

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

「成功」の場合、単一のオブジェクトが返されます。プロパティ「コンピュータ名」が含まれています。「失敗」の場合、2つのオブジェクトの配列が返されます。それ(配列自体)には、プロパティ「コンピューター名」が含まれていません。PowerShell v3では、表記を使用できる場合があります$array.SomePropertyOfContainedObjectが、PowerShellv2では常にエラーになります。それはおそらくあなたが見るものです。

結果オブジェクトの配列を反復処理する必要があります。たとえば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で「Succesful」と比較し、ファイルの値が「Successful」(「s」がない)です。

とにかく、何が機能していないのですか?

于 2012-10-28T06:39:28.227 に答える