#powershell
#powershell
Вопрос:
У меня есть текстовый файл, в котором указаны имена серверов, и мой скрипт находит статус конкретной службы для серверов и выполняет некоторые условия для запуска или остановки службы. Теперь я хочу отобразить вывод в одном представлении сетки с ПК и статусом, но когда я выполняю свой скрипт, он выдает вывод состояния в отдельной сетке для каждого сервера.Я хочу, чтобы все было в одном представлении сетки
$computers = get-content C:UsersAdministratorDesktopPowcomputer.txt
$Service = "wisvc"
foreach ($computer in $computers) {
$Servicestatus = get-service -name $Service -ComputerName $computer
if ($Servicestatus.Status -eq "Running")
{
$Servicestatus.Stop()
$Servicestatus = get-service -name $Service -ComputerName $computer
$Servicestatus | select-object Name,Status,MachineName | Out-GridView
}
else{
$Servicestatus = get-service -name $Service -ComputerName $computer
$Servicestatus | select-object Name,Status,MachineName | Out-GridView
}
}
Ответ №1:
Как заявил bvbeek, ваш Out-GridView
вызов находится внутри цикла. При использовании оператора foreach, подобного вашему, вам нужно будет собрать выходные данные в переменную. Не создавайте массив @()
и не добавляйте к нему =
, как предложено, поскольку это не нужно и может быть очень медленным при работе с большим количеством данных. Вместо этого вы можете просто собрать выходные данные всего цикла в переменную, а затем отобразить их с помощью Out-GridView
$computers = get-content C:UsersAdministratorDesktopPowcomputer.txt
$Service = "wisvc"
$results = foreach ($computer in $computers){
$Servicestatus = get-service -name $Service -ComputerName $computer
if ($Servicestatus.Status -eq "Running"){
$Servicestatus.Stop()
}
get-service -name $Service -ComputerName $computer | select-object Name,Status,MachineName
}
$results | Out-GridView
Также, как вы можете видеть, было много дублированного кода, который не служил никакой цели. Вы снова собрали статус службы в каждой ветви if / else, поэтому просто переместите его за пределы if и исключите предложение else.
Вы также можете воспользоваться преимуществами конвейера, перейдя к Foreach-Object
циклу
$computers = get-content C:UsersAdministratorDesktopPowcomputer.txt
$Service = "wisvc"
$computers | ForEach {
$Servicestatus = get-service -name $Service -ComputerName $computer
if ($Servicestatus.Status -eq "Running"){
$Servicestatus.Stop()
}
get-service -name $Service -ComputerName $computer | select-object Name,Status,MachineName
} -OutVariable results | Out-GridView
Это приведет к тем же результатам, что и предыдущий
- Соберите выходные данные в переменную
$results
- Отобразите выходные данные в
Out-GridView
Ответ №2:
Вот обходной путь для потоковой передачи foreach в out-gridview:
$computers = get-content C:UsersAdministratorDesktopPowcomputer.txt
$Service = "wisvc"
amp; {
foreach ($computer in $computers) {
$Servicestatus = get-service -name $Service -ComputerName $computer
if ($Servicestatus.Status -eq "Running") {
$Servicestatus.Stop()
}
$Servicestatus = get-service -name $Service -ComputerName $computer
$Servicestatus | select-object Name,Status,MachineName
}
} | out-gridview
Ответ №3:
Причина в том, что вы размещаете Out-GridView в цикле foreach. Пожалуйста, попробуйте это:
$computers = Get-Content C:UsersAdministratorDesktopPowcomputer.txt
$Service = "wisvc"
$Array = @()
foreach ($computer in $computers)
{
$Servicestatus = Get-Service -name $Service -ComputerName $computer
if ($Servicestatus.Status -eq "Running")
{
$Servicestatus.Stop()
$Servicestatus = Get-Service -name $Service -ComputerName $computer
$Array = $Servicestatus | Select-Object Name, Status, MachineName
}
else
{
$Servicestatus = Get-Service -name $Service -ComputerName $computer
$Array = $Servicestatus | Select-Object Name, Status, MachineName
}
}
$Array | Out-GridView
Комментарии:
1. Пожалуйста, не поощряйте
$array = @()
и$array =
— вместо этого просто делайте$array = foreach($c in $comp){...}
. Первое является плохой практикой2. @DougMaurer Я понимаю, спасибо за исправление me.my мнение заключается в том, чтобы писать читаемый код, а не обрезать все в одной строке.