获取 CPU 用法的脚本
Script to get CPU Usage
我正在使用此脚本从多个服务器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
}
}
我遇到了错误
Cannot bind argument to parameter 'FilePath' because it is null.
+ CategoryInfo : InvalidData: (:) [Out-File], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.OutFileCommand
+ PSComputerName : ServerName
你能帮我做这件事吗...?
问题是您在通过 Invoke-Command
在远程计算机上调用的脚本块中使用 $Output
,因此在远程会话中执行脚本块时未定义。
要修复它,您可以将它作为参数传递给脚本块或在脚本块中定义它,但我想您更愿意在启动客户端而不是在远程计算机上写入文件。因此,与其在脚本块中使用 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
的定义移到了脚本块中,因为它遇到了同样的问题。
我正在使用此脚本从多个服务器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
}
}
我遇到了错误
Cannot bind argument to parameter 'FilePath' because it is null. + CategoryInfo : InvalidData: (:) [Out-File], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.OutFileCommand + PSComputerName : ServerName
你能帮我做这件事吗...?
问题是您在通过 Invoke-Command
在远程计算机上调用的脚本块中使用 $Output
,因此在远程会话中执行脚本块时未定义。
要修复它,您可以将它作为参数传递给脚本块或在脚本块中定义它,但我想您更愿意在启动客户端而不是在远程计算机上写入文件。因此,与其在脚本块中使用 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
的定义移到了脚本块中,因为它遇到了同样的问题。