在特定CPU负载下运行程序的脚本

时间:2017-06-26 01:18:45

标签: windows powershell cmd

我已经尝试过3个小时了,有多个代码与此相似:

wmic cpu get loadpercentage > Load.txt
findstr "%random:~,1%" Load.txt > Load1.txt
set load=<Load1.txt
if %load%==" 2 7                              " echo yes
pause

但他们都遇到了类似的问题,wmic cpu get loadpercentage的输出:

LoadPercentage
56

格式不允许将其放入变量中,因此我无法检查它是否有任何变化。最好,我希望它可以在Windows CMD和/或Powershell中完成。

感谢您的帮助!

编辑:

感谢@lit的代码,这里的最终代码完美无缺:

:: To find the "GUID" or the codes for each power plan, run the command in CMD "powercfg -list".
set HighPerformanceMode=8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
set PowerSaverMode=a1841308-3541-4fab-bc81-f71556f20b4a

:loop
SETLOCAL ENABLEDELAYEDEXPANSION
SET "load="

FOR /F "usebackq skip=1 tokens=*" %%f IN (`wmic cpu get loadpercentage`) DO (
    IF "!load!" EQU "" (
        set "load=%%~f"
    )
)

if "%load%" geq "65" (
    ping localhost -n 2 >nul
    if "%load%" geq "65" (
        %systemroot%\System32\powercfg.exe /setactive %HighPerformanceMode%
        )
    ) else (
        if "%load%" lss "25" (
            ping localhost -n 2 >nul
            if "%load%" lss "25" (
                %systemroot%\System32\powercfg.exe /setactive %PowerSaverMode%
                )
            )
)

endlocal
ping localhost -n 3 > nul
goto loop

确保更改HighPerformanceModePowerSaverMode以获得计算机特定的电源计划。您可以在cmd。{/ p>中执行powercfg -list来查找代码

然后我创建了一个单独的短脚本,其中只有"C:\Load Batch\Load Batch.bat",但您必须将其更改为主脚本所在的位置。然后我使用了一个名为&#34; BAT to EXE converter&#34;并将其置于Ghost模式,并将新制作的.exe程序放入我的启动文件夹中。

编辑2:

我不相信我的问题是重复的,链接的问题是关于获取CPU和RAM用于看起来只是为了查看它,而我的问题是关于将负载百分比作为纯文本要在脚本中使用的表单。我知道它只测试一个CPU核心,但随着一个上升,其他人很可能有类似的负载。我在这个网站上搜索了可以分离&#34; LoadPercentage&#34;运行wmic cpu get loadpercentage时的文本,因为我无法将其设置为变量。

2 个答案:

答案 0 :(得分:2)

问题可能是wmic输出是Unicode。如何使用PowerShell?

Get-CimInstance -ClassName CIM_Processor | select LoadPercentage

我不确定需要运行什么。

cmd shell程序员的典型后备通常类似于:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "X="

FOR /F "usebackq skip=1 tokens=*" %%f IN (`wmic cpu get loadpercentage`) DO (
    IF "!X!" EQU "" (
        set "X=%%~f"
    )
)

ECHO X is %X%

修改

实际上,每个核心都会有一个LoadPercentage。你可能想要它们的算术平均值(平均值)。

Get-CimInstance -ClassName CIM_Processor |
    Measure-Object -Property LoadPercentage -Average |
    Select Average

在cmd脚本中执行此操作将涉及将LoadPercentage值相加并除以它们的计数。

SET /A TOTAL=0
SET /A CORE_COUNT=0

FOR /F "usebackq skip=1" %%t IN (`type NUL ^| wmic /node:"%SERVER_NAME%" cpu get loadpercentage ^| findstr .`) DO (
    IF "%%t" NEQ "" (
        SET /A TOTAL=!TOTAL! + %%t
    )
    SET /A CORE_COUNT=!CORE_COUNT! + 1
)

SET /A AVG_UTILIZATION=%TOTAL% / %CORE_COUNT%

ECHO Number of cores: %CORE_COUNT%
ECHO Total CPU utilisation: %TOTAL%
ECHO Average CPU utilisation: %AVG_UTILIZATION%%%

答案 1 :(得分:0)

尽管写入(临时)文件并使用set /p读取它是一种可行且有效的方法,但将命令输出到cmd中的变量的常用方法是{ {1}}循环:

for /f

for /f "" %%a in ('wmic cpu get loadpercentage /value ^|find "="') do set /a "%%a" echo %loadpercentage% 的答案一样,lit(或find)命令用于将findstr的Unicode输出转换为&#34; cmd兼容&# 34;格式。
我使用wmic参数来获取更易于解析的输出格式,并使用/value来获取数值(无需弄乱空格)。

使用set /a的好处是,您可以轻松地从同一/value命令中获取多个参数:

wmic

用引号括起完整的命令,无需转义特殊字符。当然,只有在命令字符串本身不需要引号时,这才有效。

(不引用:

for /f "delims=" %%a in ('"wmic cpu get Caption,CurrentClockSpeed,ExtClock,L2CacheSize /value |findstr = "') do set "_%%a"
set _