获取CPU使用率的脚本

时间:2016-08-26 01:54:38

标签: powershell cpu-usage invoke-command

我正在使用此脚本从多个服务器获取CPU使用率

$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

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

问题是您在通过$Output在远程计算机上调用的脚本块中使用Invoke-Command,因此在远程会话中执行脚本块时未定义。{br / > 要修复它,您可以将其作为参数传递给脚本块或在脚本块中定义它,但我想您更愿意在启动客户端而不是远程计算机上编写该文件。因此,不要在脚本块中使用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的定义移到了脚本块中,因为它遇到了同样的问题。