Скрипт для получения информации об использовании ЦП

Я использую этот скрипт для получения информации об использовании ЦП с нескольких серверов.

$Output = 'C:\temp\Result.txt'
$ServerList = Get-Content 'C:\temp\Serverlist.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.Commands.OutFileCommand + PSComputerName: ServerName

Не могли бы вы помочь мне в этом ...?


person V T    schedule 26.08.2016    source источник


Ответы (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 в блок сценария, поскольку здесь возникла та же проблема.

person DAXaholic    schedule 26.08.2016