2017-10-10 52 views
0
@echo off 
setlocal enabledelayedexpansion 
for /l %%i in (0,1,4) do (
SET count=1 
FOR /F "tokens=* USEBACKQ" %%F IN (`wmic /node:'SERVER_NAME' cpu get loadpercentage`) DO (
SET var!count!=%%F 
SET /a count=!count!+1 
) 
set var=%% %var2% 
echo CPU Usage: %var% 
) 
endlocal 
pause 

大家好。我正在BAT文件中運行一個簡單的循環,並想讓CPU%顯示超過5個循環。外觀正如預期的那樣工作 - 但是 - %var%未被填充。在BAT文件中循環/節點

如果我刪除了do函數並且只有wmic命令,它會生成並循環正常。

我錯過了一些在這裏顯而易見的東西,但看不到它。你能幫忙嗎?

回答

0
set var=%% !var2! 
echo CPU Usage: !var! 

varvar2是空的(我相信)在外部循環的開始,所以他們通過什麼在這兩個語句執行替換。

+0

完美 - 謝謝。所以 !將數據保存在變量中? (要求我理解而不是僅僅有答案) – Pez

+0

另外 - 如果我可能會問 - 如何將每個值加起來!var2!我可以得到一個總數? – Pez

+0

當'delayedexpansion'被調用時''var!'返回變量的* run-time *值(因爲它通過循環的操作而改變)。 '%var%'是* parse-time *值 - 它在解析* entire *語句時的值 - 檢查其有效性。假設'total'在到達外部'for'之前的值爲'0',那麼'set/a total = total + var2'會將遇到的'var2'的所有值總和爲total。 echo!total!'會顯示var2的總數。在嵌套'for's完成之後,!total!==%total%。 – Magoo

0

您還沒有解釋你想做什麼。如果你想要一個平均,那麼你應該積累的CPU%,並在結尾除以總和。看起來你的代碼只顯示第二個值,而不是從5個值中累積第二行

這個工作對我來說:

@echo off 
setlocal enabledelayedexpansion 
set var2=0 
for /l %%i in (0,1,4) do (
    SET count=1 
    FOR /F "tokens=* USEBACKQ" %%F IN (`wmic cpu get loadpercentage`) DO (
     if !count! equ 2 SET /A var2=var2+%%F 
     SET /a count=!count!+1 
    ) 
) 
set /A var=var2/5 
echo CPU Usage: %var% 
endlocal 
pause 

SET /a count=!count!+1線可以在這個簡單的形式寫成:SET /a count+=1

+0

嗨@Aacini - 我說我只是想得到%var2%填充:)我可以做數學來獲得平均 - 但它不是%var% - 並且原因如下所述,是因爲它將值重設爲0 - 我現在正在使用!var!它的工作方式:)但謝謝你的迴應:) – Pez

0

有時PowerShell中可以更簡單:

(Get-Counter -ComputerName 'SERVER_NAME' '\Processor(_Total)\% Processor Time' -MaxS 5 | Select -ExpandP CounterSamples | Select -ExpandP CookedValue | Measure -Average).Average 

即使從一個批處理文件:

@PowerShell -C "(Get-Counter -ComputerName 'SERVER_NAME' '\Processor(_Total)\%% Processor Time' -MaxS 5 | Select -ExpandP CounterSamples | Select -ExpandP CookedValue | Measure -Average).Average" 

只要改變SERVER_NAME適當

+0

謝謝@Compo我會看看這個。新手在bat文件方面:/ – Pez