2015-09-08 6 views
0

Я пытаюсь создать таблицу хэшей, содержащую 3 столбца.Вывод нескольких столбцов с использованием хеш-таблицы

SERVER_NAME PROCESS_NAME SERVER_STATUS PROCESS_AVAILABLE 
SERVER1  app1.exe  RUNNING   YES 
SERVER1  app2.exe  RUNNING   NO 
SERVER2  app1.exe  OFFLINE   NO 
SERVER2  app2.exe  OFFLINE   NO 
SERVER3  app1.exe  RUNNING   YES 
SERVER3  app2.exe  RUNNING   YES 

До сих пор, я попробовал этот

$SERVERLIST = Get-Content "$PSScriptRoot\servers\serverManager.bin" 
$PROCESSMONITOR = Get-Content "$PSScriptRoot\process\application.bin" 

$testList = @{Name=$SERVERLIST;Process=$PROCESSMONITOR} 

Список серверов в файле "serverManager.bin". Это CSV-файл, содержащий список серверов.

Список процессов, которые меня интересуют, находятся в файле "application.bin". Это CSV-файл, содержащий список приложений (см. PowerShell). [См ниже код]

Get-Process -ComputerName $server -name $process -ErrorAction SilentlyContinue 

Я хочу построить отчет, который говорит админ, который работает сервер, и какой процесс выполняется из списка, что мы заинтересованы в мониторинге.

я могу проверить, если процесс запущен я могу проверить, если сервер онлайн

Мой вопрос: что мне нужно сделать, чтобы получить выход, как то, что писал выше

+1

* «Я пытаюсь создать хэш-таблицу, содержащую 3 столбца.» * - ваш пример показывает четыре столбца .... – Kev

+0

Третий и четвертый столбцы не существуют, когда я импортирую свои данные из файла CSV. Должен ли я создать их и оставить пустым? Это все, что я делаю неправильно? –

+3

Какой здесь вопрос? Вы создаете хеш-таблицу с двумя ключами (то есть 'Name' и' Process'), где ключ 'Name' имеет значение' $ SERVERLIST', а ключ 'Process' имеет значение' $ PROCESSMONITOR'. Я предполагаю, что это не то, что вы хотите делать? –

ответ

4

Хотя Hashtables играют роль в этом ответе вы вообще не ищете хеш-таблицы. Глядя на about_hash_tables

Хэша таблица, также известная как словарь или ассоциативный массив, представляет собой структура, компактных данных, которые хранят один или более ключ/значение пара.

Пока вы можете вложить все, что хотите, в значение, которое вы действительно не ищете хеш-таблицу. Я думаю, что вы хотите создать собственный объект PowerShell, содержащий результаты каждого из ваших запросов.

Get-Process действительно принимает массивы как для -Computer, так и для -Name, но они будут пропускать результаты, когда компьютер не существует или процесс не выполняется. Поскольку вам нужна эта информация, вам нужно запустить один командлет для каждой пары компьютеров/процессов.

Я использую хэш-таблицу только для создания каждой отдельной строки, которая преобразуется в объект PowerShell и собирается как массив. Я не хочу путать, но я знаю, что это работает, по крайней мере, с 2.0, поэтому я так делаю.

$SERVERLIST | ForEach-Object{ 
    $computer = $_ 
    $PROCESSMONITOR | ForEach-Object{ 
     $process = $_ 
     $props = @{ 
      Server_Name = $computer 
      Process_Name = $process 
     } 

     # Check if the computer is alive. Better this was if $processes is large 
     If(Test-Connection $computer -Quiet -Count 1){ 
      $props.Server_Status = "Running" 
      $result = Get-Process -Name $process -ComputerName $computer -ErrorAction SilentlyContinue 
      If($result){ 
       $props.Process_Available = "Yes" 
      } else { 
       $props.Process_Available = "No" 
      } 
     } else { 
      $props.Server_Status = "Offline" 
      $props.Process_Available = "No" 
     } 

     New-Object -TypeName psobject -Property $props 
    } 
} | Select Server_Name,Process_Name,Server_Status,Process_Available 

Так что теперь у нас есть правильный объект, теперь вы можете использовать другие командлеты как Where-Object, Sort-Object и т.д.

+0

, где результаты сохраняются? (Спасибо !!!!!) –

+0

@softwareisfun Прямо сейчас они просто выводятся на консоль. Просто подключить их к «Export-CSV» будет наиболее эффективным вариантом. – Matt

Смежные вопросы