#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. Отлично сработало. Спасибо!