Nick W.
Nick W.

Reputation: 1614

Issues with Powershell Import-CSV

Main Script

$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

Issues:

Log_Successful."Computer Name" works fine, but if i change 4 to read as the following

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

Log_Successful."Computer Name" no longer works... Any ideas why?

Dataset

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

Upvotes: 2

Views: 4548

Answers (2)

Roman Kuzmin
Roman Kuzmin

Reputation: 42073

In case of "Successful" a single object is returned. It contains the property "Computer Name". In case of "Failed" an array of two objects is returned. It (the array itself) does not contain the property "Computer Name". In PowerShell v3 in some cases it is possible to use notation $array.SomePropertyOfContainedObject but in PowerShell v2 it is an error always. That is what you probably see.

You should iterate through the array of result objects, e.g. foreach($log in $Log_Successful) {...} and access properties of the $log objects.

And the last tip. In order to ensure that the result of Import-Csv call is always an array (not null or a single object) use the @() operator.

The code after fixes would be:

$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"
}

Upvotes: 3

Shay Levy
Shay Levy

Reputation: 126912

I'm not sure if this is the problem but you have a typo, in Where-Object you compare against "Succesful" and the value in the file is "Successful" (missing 's').

Anyway, what's not working?

Upvotes: 0

Related Questions