Проблема, связанная с представлением таблицы powershell

#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
  

Это приведет к тем же результатам, что и предыдущий

  1. Соберите выходные данные в переменную $results
  2. Отобразите выходные данные в 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 мнение заключается в том, чтобы писать читаемый код, а не обрезать все в одной строке.