Попытка получить использование процессором указанного процесса на разных серверах - PullRequest
0 голосов
/ 29 мая 2019

В основном я пытаюсь написать скрипт, который будет извлекать информацию об использовании процессором процессора (несколько процессов, указанных в файле XML) с разных серверов в сети.

Я пытаюсь использовать Invoke-Command для запуска сценария, добавления результирующей таблицы в collectionVariable и, наконец, преобразования результата в Html.

Формат таблицы

$Format = @"
<style>
TABLE {width:90%;margin-left:5%; border-width: 1px; border-style: solid; 
border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: 
black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: 
black;}
</style>
"@

Функция для анализа XML-файла с учетными данными

function parseXmlCredential {
[xml]$xml1 = get-content xmlCredentials\*.xml

$servers = $xml1.Configuration.servers;
$names = $xml1.Configuration.name;
$username = $xml1.Configuration.username;
$password = $xml1.Configuration.password;

$server = $servers -split ','
$name = $names -split ','

return $server, $name, $username, $password
}

$server, $name, $username, $password = parseXmlCredential;

Свойства выбранного элемента

 $properties = @(
 @{Name = 'Server';  Expression = { $server}},
 @{Name = "Process Name";Expression ={$_.Name}},
 @{Name = "Process Id";Expression = {$_.Id}},
 @{Name = 'CPUPercent(%)';Expression = {
      $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
      [Math]::Round( ($_.CPU * 100 / $TotalSec), 2)}},
 @{Name ="Memory (MB)";Expression = {[Math]::Round(($_.privatememorysize / 1mb),2)}}
 )

Внутри него я буду хранить результирующие таблицы для каждого процесса

$collectionVariable = New-Object System.Collections.ArrayList

Доступ ко всем серверам

foreach($j in $server)
 {
 $server = $j   

Для каждого сервера я получаю данные для всех необходимых процессов

foreach($i in $name)
 {
 $rezultat = Invoke-Command -ComputerName $j -ScriptBlock {

 $table = Get-Process | 
 Where-Object {$_.Name -like $i+'*' } |
 Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
 Select-Object  $properties |
 Sort-Object -Property *CPUPercent* -Descending |
 ConvertTo-Html -As TABLE -Fragment |
 Out-String

 $collectionVariable.Add($table) | Out-Nul
   } -ArgumentList $i,(,$properties),(,$collectionVariable) 
  } 
 }

Преобразование результата в Html

ConvertTo-Html -Head $Format -PostContent $collectionVariable |
 Out-File //the out file

В результате у меня должна быть HTML-страница с таблицами для каждого процесса, но я получаю следующую ошибку.

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName        : osvm2309

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName        : osvm2309

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName        : osvm2256

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName        : osvm2256

ConvertTo-Html : Cannot validate argument on parameter 'PostContent'. The 
argument is null, empty, or an element of the argument collection 
contains a null value. Supply a collection that does not contain any null 
values and then try the command again.
At C:\Users\lucianp\Downloads\processes_details_powershell\script.ps1:72 
char:43
+ ConvertTo-Html -Head $Header -PostContent $collectionVariable |
+                                           ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [ConvertTo-Html], 
ParameterBindingValidationException    +FullyQualifiedErrorIdParameterArgumentValidationError,Microsoft.PowerShell.Commands.ConvertToHtmlCommand             

1 Ответ

0 голосов
/ 30 мая 2019

Я нашел ответ: проблема была в collectionVariable, я пытался добавить результат в Invoke-Command. Вместо этого я должен добавить $ rezultat вне команды invoke, справа после нее.

...