使用 Windows 脚本更改进程的亲和力

问题描述 投票:0回答:4

在 Windows 中,使用

 START /node 1 /affinity ff cmd /C "app.exe"

我可以设置app.exe的亲和力(app.exe使用的核心数)。

使用 Windows 脚本,如何更改正在运行的进程的亲和力?

windows batch-file affinity
4个回答
23
投票

PowerShell 可以为您完成此任务。

获得亲和力
$Process = Get-Process app
$Process | Select-Object ProcessorAffinity
设置亲和力
$Process = Get-Process app
$Process.ProcessorAffinity = 255

示例(8核处理器)

核心# 价值 位掩码
核心1 1 0x00000001
核心2 2 0x00000010
核心3 4 0x00000100
核心4 8 0x00001000
核心5 16 0x00010000
核心6 32 0x00100000
核心7 64 0x01000000
核心8 128 0x10000000

只需将您要使用的核心的十进制值相加即可。

  • 所有 8 个核心 = 值: 255 = 位掩码: 0x11111111

与cmd.exe一起使用

您可以通过使用代码作为参数调用 PowerShell 进程,在 cmd shell 中使用 PowerShell 代码。用分号分隔命令。

> powershell.exe "Get-Process notepad++ | Select-Object ProcessorAffinity"

                                                         ProcessorAffinity
                                                         -----------------
                                                                       255


> powershell.exe "$p = Get-Process notepad++; $p.ProcessorAffinity = 13"

> powershell.exe "Get-Process notepad++ | Select-Object ProcessorAffinity"

                                                         ProcessorAffinity
                                                         -----------------
                                                                        13

来源

这里有一篇关于如何更改进程亲和力的详细文章:

设置处理器亲和性@ EnergizedTech
archive.today / archive.org
(破损的图像并不重要)


12
投票

接受的答案有效,但仅适用于列表中的第一个进程。评论中的解决方案对我来说不起作用。

要更改具有相同名称的所有进程的关联性,请使用以下命令:

Powershell "ForEach($PROCESS in GET-PROCESS processname) { $PROCESS.ProcessorAffinity=255}"

其中

255
是接受的答案中给出的掩码。


2
投票

对于其他正在寻找此问题答案但没有找到任何答案的人,我找到的解决方案是使用名为 WinAFC(或 AffinityChanger)的应用程序。这是一个部分 GUI、部分命令行应用程序,允许您为某些可执行文件指定配置文件,并将轮询它们的进程列表。如果它找到匹配的进程,它将根据加载的配置文件中的设置更改这些进程的亲和力。

这里有一些文档:http://affinitychanger.sourceforge.net/

出于我的目的,我创建了一个如下所示的配置文件:

TestMode = 0
TimeInterval = 1
*\convert.exe := PAIR0+PAIR1

此配置文件将任何convert.exe进程设置为使用前两个CPU核心对(CPU0、CPU1、CPU2和CPU3),每秒轮询一次。

TestMode
是一个开关,可让您查看您的个人资料是否正常工作,而无需实际设置关联性。

希望有人觉得这很有用!


1
投票

如果你真的喜欢枚举,你可以这样做。 ProcessorAffinity 是一个 IntPtr,因此需要一些额外的类型转换。

[flags()] Enum Cores {
  Core1 = 0x0001
  Core2 = 0x0002
  Core3 = 0x0004
  Core4 = 0x0008
  Core5 = 0x0010
  Core6 = 0x0020
  Core7 = 0x0040
  Core8 = 0x0080
}

$a = get-process notepad

[cores][int]$a.Processoraffinity
Core1, Core2, Core3, Core4

$a.ProcessorAffinity = [int][cores]'core1,core2,core3,core4'
© www.soinside.com 2019 - 2024. All rights reserved.