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

Windows 在特定CPU负载下运行程序的脚本,windows,powershell,cmd,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 该格式不允许将其放入变量中,因此我无法对其进行任何检查。很好,我希望它在Windows CMD和/或Pow

我已经试了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
该格式不允许将其放入变量中,因此我无法对其进行任何检查。很好,我希望它在Windows CMD和/或Powershell中完成

谢谢你的帮助

编辑: 感谢@lit提供的代码,以下是我的最终代码,它可以完美地工作: 确保更改
HighPerformanceMode
PowerSaverMode
以获得特定于计算机的电源计划。您可以通过在cmd中执行
powercfg-list
来查找代码

然后,我制作了一个单独的短脚本,其中只有
“C:\Load Batch\Load Batch.bat”
,但您必须将其更改为主脚本所在的位置。然后,我使用了一个名为“BAT-to-EXE转换器”的程序,将其置于重影模式,并将新生成的.EXE程序放入我的启动文件夹

编辑2:
我不相信我的问题是重复的,链接的问题是获取CPU和RAM的使用率,而我的问题是获取脚本中使用的纯文本形式的负载百分比。我知道它只测试一个CPU内核,但随着一个CPU内核的增加,其他CPU内核很可能有类似的负载。我在这个网站上搜索了在运行
wmic cpu get LoadPercentage
时分离“LoadPercentage”文本的代码,因为我无法将其设置为那样的变量。

问题可能是
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%
编辑:

实际上,每个核心都会有一个负载百分比。您可能需要它们的算术平均值(平均值)

在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%%%
虽然写入(临时)文件并用
set/p
读回是一种可能且有效的方法,但将命令输出放入
cmd
变量的常用方法是
for/f
循环:

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

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

for /f "delims=" %%a in ('"wmic cpu get Caption,CurrentClockSpeed,ExtClock,L2CacheSize /value |findstr = "') do set "_%%a"
set _
将完整的命令括在引号中可以消除转义特殊字符的需要。当然,只有在commandstring本身不需要引号的情况下,这才有效

(未引用:

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

)

哦,我没有想到它是用Unicode编码的。这可以解释在ASCII文本文件中输入空格和内容时出现的错误。我想做的是,如果我的CPU负载高于50%,那么它就会切换到高功率电池模式。同样,如果低于50%,则切换到低功率电池模式。你能解释一下你在这里编写的Windows CMD代码为什么有效吗?它看起来非常类似于我在stackoverflow上找到的代码,但这些代码不起作用。它是否将其转换为ASCII或其他格式?似乎通过管道或FOR循环内的机制将转换为OEM(在英语机器上通常是代码页437)。我相信@dbenham可以给出一个更好的答案。如果这段代码对您来说很好,您介意将其标记为答案吗?我尝试了上面的CMD脚本,它返回了1的所有值,这是不对的。我现在使用的脚本中的单核测试适用于我的目的,因为如果一个在上,其他的通常是串联的。@lit:转换的不是管道,而是
find
findstr
(至少在
cmd
-不知道Powershell)请查看答案中的编辑。它没有考虑多核CPU。
for /f "" %%a in ('wmic cpu get loadpercentage /value ^|find "="') do set /a "%%a"
echo %loadpercentage%
for /f "delims=" %%a in ('"wmic cpu get Caption,CurrentClockSpeed,ExtClock,L2CacheSize /value |findstr = "') do set "_%%a"
set _
for /f "delims=" %%a in ('wmic cpu get Caption^,CurrentClockSpeed^,ExtClock^,L2CacheSize /value ^|findstr = ') do set "_%%a"