Powershell foreach и export-csv не работают - PullRequest
1 голос
/ 19 июня 2019

Я использую 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

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Я бы очень хотел использовать com-объект Task Scheduler для этого, чтобы мне не пришлось создавать удаленные сеансы на всех компьютерах, просто подключиться к их службе планировщика задач. Для этого требуется, чтобы вы включили удаленное управление запланированными задачами в брандмауэре, но если вы разрешаете удаленный 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
1 голос
/ 19 июня 2019

Есть несколько забавных моментов в коде в его нынешнем виде.

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...