В основном я пытаюсь написать скрипт, который будет извлекать информацию об использовании процессором процессора (несколько процессов, указанных в файле 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