【问题标题】:How can I get the number of CPU cores in Powershell?如何获取 Powershell 中的 CPU 内核数?
【发布时间】:2021-11-06 21:29:20
【问题描述】:

假设我在 Windows 机器上运行(电源)shell。

有没有我可以使用的单线:

  1. 物理处理器内核的数量和/或
  2. 运行中线程的最大数量,即核心 * 超线程因子?

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

【问题讨论】:

  • @mklement0:我不明白你为什么认为应该这么快提供反馈。我不是每天都在做这些事情。即使我需要一两个星期……也许我生病了?也许我在度假?也许我正忙于其他事情?答案不会过时(好吧,无论如何都不会过时)。
  • 怀疑,基于您最初反馈的性质以及此后您又问了三个问题的事实,您已经放弃了这个问题和上一个问题,尽管我反复要求反馈。我知道,给予答案适当的关注可能需要一段时间,并且不应该期望特定的时间范围(当然,no 答案可能值得接受)。在手头的案例中,根据活动停止前的讨论,结束似乎是微不足道的,这就是我坚持的原因。我很高兴看到我的怀疑是不正确的。

标签: windows powershell windows-10 cpu


【解决方案1】:

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

  • CIM cmdlet(例如,Get-CimInstance)取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet(例如,Get-WmiObject)。因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) (v6+),所有未来的努力都将用于,甚至不再拥有它们。但是请注意,WMI 仍然是 CIM cmdlet 的基础。如需更多信息,请参阅this answer

  • Format-Table 与所有 Format-* cmdlet 一样,旨在为人类观察者生成显示格式,而 > 输出适合以后编程处理的数据(更多信息请参见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

当然,如果您只对 values 感兴趣(CPU 仅计算为数字),则不需要 intermediate 对象并且可以省略 @ 987654335@以上电话。

至于单线

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

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

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

【讨论】:

    【解决方案2】:

    使用 PowerShell 找出处理器核心数

    Get-WmiObject –class Win32_processor | ft NumberOfCores,NumberOfLogicalProcessors

    要找出正在运行的线程数:

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

    【讨论】:

    • 顺便说一句:CIM cmdlet(例如,Get-CimInstance)在 PowerShell v3(2012 年 9 月发布)中取代了 WMI cmdlet(例如,Get-WmiObject)。因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) (v6+),未来所有努力的方向,甚至不再拥有它们。但是请注意,WMI 仍然是 CIM cmdlet 的基础上。有关详细信息,请参阅this answer
    • @mklement0:那么,我如何使用 Get-CimInstance 获取物理/逻辑内核的数量?
    • 同一类,几乎完全相同的语法。运行 Get-Help Get-CimInstance 以查看正确的语法,但应该是:Get-CimInstance -ClassName win32_processor | Select NumberofCores
    • Get-CimInstance –ClassName Win32_Processor | Format-Table -Property NumberOfCores,NumberOfLogicalProcessors
    【解决方案3】:

    有几个 cmets 有相似的答案。 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
    

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 2012-10-12
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多