【问题标题】:ForEach-Object piped to CSV is only showing last element传送到 CSV 的 ForEach-Object 仅显示最后一个元素
【发布时间】:2015-01-24 23:38:08
【问题描述】:

我正在尝试将多台远程机器的计划任务导出到 csv。我正在使用this script 的修改版本。我正在尝试为每台机器导出一个列出所有计划任务的 csv。目前我的代码只是导出每台机器的最后一个任务。

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

我尝试将 Export-Csv 放在每个花括号的末尾,但没有输出我想要的。任何想法我做错了什么?

【问题讨论】:

    标签: powershell foreach pipe export-to-csv


    【解决方案1】:

    编辑 我不确定这是否完全解决了这个问题,因为代码的某些部分对我来说似乎很奇怪,例如$tasks = $folder.GetTasks。但是 OP 标题清楚地表明 CSV 显示了最后一个元素,这对我来说意味着他的代码除了 Export-CSV 部分之外大部分都有效。

    Export-Csv 需要一个数组作为输入,因此下面的代码使用$task 中的元素来生成对象数组。 Select-Object 可以决定属性在 CSV 中的存储顺序。

    试试这个:

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

    这个新版本以每台计算机为基础保存结果。

    【讨论】:

    • 假设这确实解决了问题,但是如果您解释为什么这样做,对 OP 和其他人来说这是值得的。
    • 我在 3 台机器上运行这个。第一个导出1个任务,第二个导出5个,第三个导出0个。不过我知道第一个有215,第二个有224,第三个有70。
    • 好的,那你需要看看$Tasks是怎么填充的,是否有全部数据。
    • 我看到您添加了一些更改,让我也将它们合并到我的答案中
    • 如果我将整个脚本通过管道传输到 CSV 并从脚本中删除 Export-Csv,所有任务都会显示在一个文件中。
    【解决方案2】:

    您不会在循环中更改 $exportPath 或 $computername,因此每次通过外部循环时,都会覆盖 csv 文件。还有这个

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

    可能是错误的。如果您要确定 $Tasks 是否等于 $Folder.GetTasks(0),则需要:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多