Выполнение цикла For через многострочную переменную Powershell

#powershell

Вопрос:

У меня есть раздел сценария, в котором пользователь вводит список имен серверов, который затем проверяет, существуют ли они в AD, а затем запускает команду для каждого из существующих. Это то, что у меня есть:

 $machineNames = (read-host "Enter Server Name(s) (space separated)").Trim()

foreach ($machineName in (($machineNames).Split(' '))) {
    Try {
        Get-ADComputer $machineName | Out-Null
        $veriMachineNames  = "$machineName`n"
    }
    Catch {
        Write-Host "*****Invalid Machine Name:  $machineName" -Foreground Yellow
        Write-Host "*****Skipping $machineName`n" -Foreground Yellow
    }
}

foreach ($machine in $sepMachineNames) {
    Write-Host "Server: $machine `n"
}
 

Когда я запускаю эту часть скрипта, я получаю следующий вывод (ошибка включена намеренно):

 PS C:> C:script.ps1

Enter Machine Name(s) (space separated): server1 server2 server3
*****Invalid Machine Name:  server3
*****Skipping server3

Server: server1
server2
 

Как вы можете видеть, похоже, что второй foreach видит server1 и server2 как находящиеся в одной строке, а не в двух строках. Есть ли способ сделать это с помощью только переменной? Я бы предпочел не выводить список в файл.

Ответ №1:

Вместо того, чтобы объединять каждое имя в большую многострочную строку вручную, просто выведите отдельные имена 1 на 1 и сохраните их в переменной:

 $veriMachines = foreach ($machineName in (($machineNames).Split(' '))) {
    Try {
        Get-ADComputer $machineName | Out-Null
        # no piping to `|Out-Null`, this will "bubble up" to the variable
        $machineName
    }
    Catch {
        Write-Host "*****Invalid Machine Name:  $machineName" -Foreground Yellow
        Write-Host "*****Skipping $machineName`n" -Foreground Yellow
    }
}
 

Теперь $veriMachines это массив строк (имена машин, которые мы только что проверили), которые вы можете перебирать:

 foreach($machine in $veriMachines){
    Write-Host "Server: $machine"
}
 

Комментарии:

1. Отлично сработало. Спасибо!