Скрипт для получения загрузки процессора


Я использую этот скрипт, чтобы получить загрузку процессора с нескольких серверов

$Output = 'C:tempResult.txt'
$ServerList = Get-Content 'C:tempServerlist.txt'
$CPUPercent = @{
  Label = 'CPUUsed'
  Expression = {
    $SecsUsed = (New-Timespan -Start $_.StartTime).TotalSeconds
    [Math]::Round($_.CPU * 10 / $SecsUsed)
  }
}
Foreach ($ServerNames in $ServerList) {
  Invoke-Command -ComputerName $ServerNames -ScriptBlock {
    Get-Process | Select-Object -Property Name, CPU, $CPUPercent, Description | Sort-Object -Property CPUUsed -Descending | Select-Object -First 15 | Format-Table -AutoSize | Out-File $Output -Append
  }
}

И я получаю ошибку

Не может привязать аргумент к параметру 'FilePath', поскольку он равен null. + CategoryInfo: InvalidData: (:) [Out-File], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrornullnotallowed, Microsoft.PowerShell.Команды.OutFileCommand + PSComputerName: Имя_сервера

Можете ли вы помочь мне в этом?..?

1 2

1 ответ:

Проблема заключается в том, что вы используете $Output в блоке скрипта, который вызывается на удаленном компьютере через Invoke-Command и поэтому не определяется, когда блок скрипта выполняется в удаленном сеансе.
Чтобы исправить это, вы можете передать его в качестве параметра в блок скрипта или определить его в блоке скрипта, но я думаю, что вы скорее хотите записать файл на инициирующем клиенте, а не на удаленном компьютере. Поэтому вместо использования Out-File в блоке скрипта вы можете использовать его вне скрипта блок вот так

$Output = 'C:\temp\Result.txt'
$ServerList = Get-Content 'C:\temp\Serverlist.txt'

$ScriptBlock = {  

    $CPUPercent = @{
      Label = 'CPUUsed'
      Expression = {
        $SecsUsed = (New-Timespan -Start $_.StartTime).TotalSeconds
        [Math]::Round($_.CPU * 10 / $SecsUsed)
      }
    }  

    Get-Process | 
      Select-Object -Property Name, CPU, $CPUPercent, Description | 
      Sort-Object -Property CPUUsed -Descending | 
      Select-Object -First 15  
}

foreach ($ServerNames in $ServerList) {
  Invoke-Command -ComputerName $ServerNames -ScriptBlock $ScriptBlock | 
    Out-File $Output -Append
}
Пожалуйста, обратите внимание, что я переместил определение $CPUPercent в блок скрипта, поскольку это страдало от той же проблемы.