首页 > 解决方案 > 解析powershell输出

问题描述

我遇到了这样的问题,我不知道如何最好地解决它。我们有这个脚本,确定 CPU 上的负载。

$pc = 'cmd'
 
try {$Connection = Test-Connection -ComputerName $pc -Count 2 -EA Stop}
catch {Write-Host "NO network connection to $PC" -fo Red; break}
 
try
{
    $option = New-CimSessionOption -Protocol Dcom
    $session = New-CimSession -ComputerName $pc -SessionOption $option -EA Stop
}
catch
{
    try
    {
        $option = New-CimSessionOption -Protocol Wsman
        $session = New-CimSession -ComputerName $pc -SessionOption $option -EA Stop
    }
    Catch {Write-Host "NOT connect to CimSession on $PC" -fo Red; break}
}
 
$ComputerSystem = Get-CimInstance -ClassName Win32_ComputerSystem -CimSession $session
$CpuCores = $ComputerSystem.NumberOfLogicalProcessors
 
Write-Host 'Please wait for CPU Usage data to be collect...' -fo Yellow
 
if (Get-Counter -ListSet * -ComputerName $pc | ? Paths -Match "\\Процесс\(\*\)"){$CounterPath = "\Процесс(*)\% загруженности процессора"}
else {$CounterPath = "\Process(*)\% Processor Time"}
 
$CPU_Usage_Counter = (Get-Counter -Counter $CounterPath -SampleInterval 1 -MaxSamples 5 -ComputerName $pc -EA SilentlyContinue).CounterSamples | ? CookedValue -ne 0 | group InstanceName
 
$CPU_Usage_Data = $CPU_Usage_Counter | select Name,@{N='CPU_Usage_%';E={[math]::Round(($_.Group | %{$_.CookedValue} | measure -Average).Average/$CpuCores,2)}}
$CPU_Usage_Data | ? Name -ne '_total' | sort 'CPU_Usage_%' -Des | ft -a
 
Write-Host "NumberOfLogicalProcessors: $CpuCores"
$check = Write-Host "CpuUsageProcess" ( [math]::Round((100 - (($CPU_Usage_Data | ? Name -eq 'idle').'CPU_Usage_%')),2) ) -fo Yellow
#####---------------------------------------------------------------------------------------------------------------------------------------------------

$status = (($check).CpuUsageProcess -gt 5)
if($status)
{
    #Break
    Write-Host -ForegroundColor Green 'if!'
}
else
{
    Write-Host -ForegroundColor Red 'else!'
}

在此处输入图像描述

执行后,需要提取“CpuUsageProcess”值的结果,在if/else条件中使用

标签: powershellparsing

解决方案


正如Theo 指出的那样Write-Host从不发出任何输出 - 它只会导致 PowerShell 将输入直接写入屏幕缓冲区。

在调用之前分别计算值Write-Host

$check = [math]::Round((100 - (($CPU_Usage_Data | ? Name -eq 'idle').'CPU_Usage_%')),2)
Write-Host "CpuUsageProcess $check" -fo Yellow

if($check -gt 5){
    # ...
}

推荐阅读