如何获取 Powershell 中的 CPU 个核心数?

How can I get the number of CPU cores in Powershell?

假设我在 Windows 机器上 运行 a (power)shell。

有没有 one-liner 我可以用来获取:

  1. 物理处理器核心数and/or
  2. in-flight 线程的最大数量,即内核 * hyper-threading 系数?

注意:我只需要一个数字作为命令输出,而不是任何 headers 或文本。

使用 PowerShell 找出处理器内核数

Get-WmiObject –class Win32_processor | ft NumberOfCores,NumberOfLogicalProcessors

求线程数是多少运行:

(Get-Process|Select-Object -ExpandProperty Threads).Count

有几条评论的答案相似。 Get-WmiObject 已弃用。选择 Get-CimInstance。不要在脚本中使用别名。拼出命令和参数。显式优于隐式。

Get-CimInstance –ClassName Win32_Processor | Format-Table -Property NumberOfCores,NumberOfLogicalProcessors

更新:

如果您只想将单个数字值分配给变量。

$NumberOfCores = (Get-CimInstance –ClassName Win32_Processor).NumberOfCores
$NumberOfLogicalProcessors = (Get-CimInstance –ClassName Win32_Processor).NumberOfLogicalProcessors

Ran Turner's answer提供了关键的指针,但可以通过两种方式进行改进:

  • CIM cmdlet(例如,Get-CimInstance) superseded the WMI cmdlets (e.g., Get-WmiObject) in PowerShell v3 (released in September 2012). Therefore, the WMI cmdlets should be avoided, not least because PowerShell (Core) (v6+), where all future effort will go, doesn't even have them anymore. Note that WMI still underlies the CIM cmdlets, however. For more information, see this answer

  • Format-Table, as all Format-* cmdlets, is designed to produce for-display formatting, for the human observer, and not to output data suitable for later programmatic processing (see this answer了解更多信息。

    • 要使用输入对象属性的 子集 创建 对象 ,请使用 Select-Object cmdlet。 (如果输出对象具有 4 个或更少的属性并且未被捕获,它们 隐式 格式就像 Format-Table 已被调用;具有 5 个或更多属性,它是隐含的 Format-List).

因此:

# Creates a [pscustomobject] instance with 
# .NumberOfCores and .NumberOfLogicalProcessors properties.
$cpuInfo =
  Get-CimInstance –ClassName Win32_Processor | 
     Select-Object -Property NumberOfCores, NumberOfLogicalProcessors

# Save the values of interest in distinct variables, using a multi-assignment.
# Of course, you can also use the property values directly.
$cpuPhysicalCount, $cpuLogicalCount = $cpuInfo.NumberOfCores, $cpuInfo.NumberOfLogicalProcessors

当然,如果您只对 感兴趣(CPU 只是数字),则不需要 中间 对象,可以省略上面的 Select-Object 调用。

至于单行:

如果你想要一个创建不同变量的单行代码,而不需要重复 - 昂贵的 - Get-CimInstance 调用,你可以使用辅助。利用 PowerShell 将赋值 用作表达式 :

的能力的变量
$cpuPhysicalCount, $cpuLogicalCount = ($cpuInfo = Get-CimInstance -ClassName Win32_Processor).NumberOfCores, $cpuInfo.NumberOfLogicalProcessors
  • 要将数字保存在不同的变量中 输出它们(return 它们作为 2 元素数组),将整个语句包含在(...).

  • 输出数字,只需省略$cpuPhysicalCount, $cpuLogicalCount =部分即可。