Brad
Brad

Reputation: 38

ForEach-Object piped to CSV is only showing last element

I'm trying to export to csv the scheduled tasks for multiple remote machines. I'm using a modified version of this script. I'm trying to export one csv per machine that lists all of the scheduled tasks. Currently my code just exports the last task for each machine.

foreach ($computerName in $computerNames) {
    $Schedule.connect($computerName) 
    $AllFolders = Get-AllTaskSubFolders

    foreach ($Folder in $AllFolders) {
        if ($Tasks = $Folder.GetTasks(0)) {
            $TASKS | % {[array]$results += $_}
            $Tasks | Foreach-Object {
                New-Object -TypeName PSCustomObject -Property @{
                    'Name' = $_.name
                    'Path' = $_.path
                    'Server' = $computername
                } | Export-Csv $("C:\Users\MyName\Desktop\" + $computername + ".csv")
            }
        }
    } 
}

I've tried putting the Export-Csv at the end of each of the curly braces and none output what I want. Any ideas what I'm doing wrong?

Upvotes: 0

Views: 1855

Answers (2)

Micky Balladelli
Micky Balladelli

Reputation: 9991

EDIT I'm not sure this fully addresses the issue, as some parts of the code seem weired to me such as $tasks = $folder.GetTasks. However OP title clearly says that the CSV is showing the last element meaning to me that his code mostly works except for the Export-CSV part.

Export-Csv expects an array as input, so the code below uses the elements in $task to generate the array of objects. Select-Object is there to decide in which order the properties are stored in the CSV.

Try this:

foreach ($computerName in $computerNames) {
    $Schedule.connect($computerName) 
    $AllFolders = Get-AllTaskSubFolders

    $result = @()
    foreach ($Folder in $AllFolders) {
        if ($Tasks = $Folder.GetTasks(0)) {
            $TASKS | % {[array]$results += $_}

            $Tasks | Foreach-Object {
                $result += New-Object -TypeName PSCustomObject -Property @{
                    Name = $_.name;
                    Path = $_.path;
                    Server = $computername
                }
            }
        }
    }

    $result | select Name, Path, Server | Export-Csv $($exportPath + $computername + ".csv")
}

This new version saves results on a per computer basis.

Upvotes: 1

KevinD
KevinD

Reputation: 3163

You are not changing either $exportPath or $computername in your loop, so each time through your outer loop, the csv file is being overwritten. Also, this

if ($Tasks = $Folder.GetTasks(0)) {

may be wrong. If you're trying to determine if $Tasks is equal to $Folder.GetTasks(0), you'd need this:

if ($Tasks -eq $Folder.GetTasks(0)) {

Upvotes: 0

Related Questions