【问题标题】:Powershell foreach and export-csv doesn't workPowershell foreach 和 export-csv 不起作用
【发布时间】:2019-11-01 15:01:13
【问题描述】:

我使用 powershell V3 和/或 powershell V4 自从我处理这个问题以来已经有几天了,但到目前为止还没有解决方案。

我解释一下,我有一个带有输入文件(服务器列表)的粗俗 powershell,我希望通过循环 foreach 对其应用处理,并在 csv 中检索输出。

循环似乎可以工作,但是,在一个 100 行的输入文件上,只有最后一个是导出的(以前的出现被覆盖)为什么我不知道。我已经尝试通过添加增量变量来重新调整脚本(请参阅下面的代码),但没有成功。

你能帮我解决这个案子吗

enter code here Code1
                                            # Emplacement fichierSource
                        $fileComputerNames = "E:\ReportXplanif\ServeursIUCR2K12.txt"
                        # Write-Host $fileComputerNames

                        # Emplacement fichierDestination
                        $desti = "E:\ReportXplanif"
                        # Write-Host $desti

                        Foreach ($server in Get-Content $fileComputerNames) {


                            $cmde = {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
                            Invoke-Command -ComputerName $server -ScriptBlock $cmde |
                            Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
                            }
                           Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation


                    code2
                    # Emplacement fichierSource
                    $fileComputerNames = "E:\ReportXplanif\ServeursIUCR2K12.txt"
                    # Write-Host $fileComputerNames

                    # Emplacement fichierDestination
                    $desti = "E:\ReportXplanif\"
                    # Write-Host $desti

                    $cmde = @()
                    Foreach ($server in Get-Content $fileComputerNames) {


                        $cmde += {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
                        Invoke-Command -ComputerName $server -ScriptBlock $cmde |
                        Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
                        }`enter code here`

                        $cmde | Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation`enter

【问题讨论】:

  • 这是因为您没有附加到 ($desti + "\XplanifTasks.csv"),而是用脚本中的最后一行覆盖它。尝试使用 Export-csv ($desti + "\XplanifTasks.csv") -Append -Delimiter "," -NoTypeInformation`enter
  • 此代码中的错误不仅仅是附加错误。 Export-CSV 没有任何数据传输到它,并且它看起来没有正确的语法来启动循环。例如Foreach ($server in (Get-Content $fileComputerNames)) {

标签: powershell loops foreach export-csv


【解决方案1】:

我很想使用 Task Scheduler com 对象来执行此操作,这样我就不必在所有计算机上创建远程会话,只需连接到他们的任务调度程序服务即可。这确实需要您在防火墙中启用计划任务的远程管理,但如果您允许远程 powershell,您可能也允许这样做。

$Scheduler = New-Object -ComObject Schedule.Service
Get-Content $fileComputerNames -PipelineVariable 'Server' |ForEach-Object{
    $i=0
    # Try to connect to remote task scheduler up to 3 times
    While(!$Scheduler.Connect($Server) -eq 0 -or $i -eq 3){$i++}
    # If we aren't connected to the right server throw a warning and move on to the next server
    If(!$Scheduler.TargetServer -eq $Server){Write-Warning "Unable to connect to $Server"; Continue}
    $RootFolder = $Scheduler.GetFolder('\')
    $RootFolder.GetTasks(1) | # The '1' indicates we want to include hidden tasks
        Where {$_.Principal.userid -eq "ZRES\XPLANIF"} |
        Select @{LABEL='Serveur';EXPRESSION={$server}}, Name, LastRunTime, NextRunTime
} | Export-Csv "$desti\XplanifTasks.csv" -Del ',' -NoType

【讨论】:

    【解决方案2】:

    目前的代码有一些有趣的地方。

    1. 看起来好像您正在构建一个数组$cmde 的脚本块。为$fileComputerNames 中的每个服务器添加一个脚本块,即使这些脚本块不是特定于服务器的。 (Invoke-Command 甚至接受脚本块数组吗?我希望它会出错)
    2. 然后您将这个$cmde 传送到Export-CSV
    3. 虽然使用 += 构建数组没有任何问题,但它在 PowerShell 中的效率非常低,如果数组很大,则应避免使用它,因为它会显着减慢您的脚本速度。

    我无法完全审查您的尝试,但假设您的 Invoke Command 在一台计算机上执行您想要的操作,如下所示应该适合您。

    ...
    $cmde = {Get-ScheduledTask | Where {$_.Principal.userid -eq "ZRES\XPLANIF"} | Get-ScheduledTaskInfo}
    $SchTasks = Foreach ($server in Get-Content $fileComputerNames) {
        Invoke-Command -ComputerName $server -ScriptBlock $cmde |
        Select @{LABEL='Serveur';EXPRESSION={$server}}, TaskName,LastRunTime,NextRunTime
    }
    
    $SchTasks | Export-csv ($desti + "\XplanifTasks.csv") -Delimiter "," -NoTypeInformation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2019-12-02
      相关资源
      最近更新 更多