这是困难的一个。
我需要使用命令从我的服务器输出确切的内核数。
我的测试:
X
:在具有4个处理器(插槽)和2个核心(每个没有HT)的Windows服务器上。Y
:在具有2个处理器(套接字)和6个核心(每个都带有HT)的Windows服务器上。GetSystemInfo只获得安装的处理器数量:X为4,Y为2。
| | X: 8 cores | Y: 12 cores |
| | 4x2 (no HT) | 2x6 (HT) |
|----------------|-------------|-------------|
| Desired output | 8 | 12 |
| GetSystemInfo | 4 | 2 |
%NUMBER_OF_PROCESSORS%
是一个很好的,但它考虑到HT。它告诉我8为X,24为Y(因为它有HT,我需要它显示12)。
| | X: 8 cores | Y: 12 cores |
| | 4x2 (no HT) | 2x6 (HT) |
|------------------------|-------------|-------------|
| Desired output | 8 | 12 |
| GetSystemInfo | 4 | 2 |
| %NUMBER_OF_PROCESSORS% | 8 | 24 |
"wmic cpu get NumberOfCores"
获取每个插槽的信息。例如:
X:
>wmic cpu get NumberOfCores
NumberOfCores
2
2
2
2
Y:
>wmic cpu get NumberOfCores
NumberOfCores
6
6
含义
| | X: 8 cores | Y: 12 cores |
| | 4x2 (no HT) | 2x6 (HT) |
|----------------------------|-------------|-------------|
| Desired output | 8 | 12 |
| GetSystemInfo | 4 | 2 |
| %NUMBER_OF_PROCESSORS% | 8 | 24 |
| wmic cpu get NumberOfCores | 2,2,2,2 | 6,6 |
叹。
我希望在CMD中保持简单,但我正在考虑启动一个Powershell脚本来完成所有数学和东西。
有什么想法吗?
如果我理解您的每个服务器的问题,您想要检索一个整数,即物理处理器(核心)的总数。根据超线程是否可用并启用,这可能是逻辑处理器数量的一半,但您特别想要排除这些。
Win32_Processor
WMI class的实例代表单处理器插槽。 NumberOfCores
属性指示该套接字提供的物理处理器的数量。我们可以使用Get-CimInstance
cmdlet在PowerShell中查询:
Get-CimInstance -ClassName 'Win32_Processor' `
| Select-Object -Property 'DeviceID', 'Name', 'NumberOfCores';
要为每个NumberOfCores
实例添加Win32_Processor
属性,我们可以使用Measure-Object
cmdlet:
Get-CimInstance -ClassName 'Win32_Processor' `
| Measure-Object -Property 'NumberOfCores' -Sum;
在结果输出中,Sum
将包含物理核心的总数,而Count
将包含套接字的总数。
请注意,在旧版本的Windows / PowerShell上,您可能需要将Get-WmiObject
cmdlet替换为Get-CimInstance
。此外,如果您确实想获得逻辑(超线程)处理器的数量,您可以将NumberOfLogicalProcessors
属性替换为NumberOfCores
。
建议的命令在具有超过64个逻辑核心的计算机上不起作用
(Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
提供多个逻辑核心(HT核心)
如果我理解正确的话,这个vbscript会给你们两个。 Powershell方法 - https://blogs.technet.microsoft.com/heyscriptingguy/2011/09/26/use-powershell-and-wmi-to-get-processor-information/
On Error Resume Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL",wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
WScript.Echo "NumberOfCores: " & objItem.NumberOfCores
WScript.Echo "NumberOfLogicalProcessors: " & objItem.NumberOfLogicalProcessors
Next
如果服务器包含多个物理处理器,Powershell可能会提供更好的报表布局。
Get-WmiObject –class Win32_processor | ft systemname,Name,DeviceID,NumberOfCores,NumberOfLogicalProcessors
迟到了,但这将作为一个完整的DOS解决方案
set val=0 & for /f "tokens=2 delims==" %d in ('wmic cpu get NumberOfCores /value ^| findstr "="') do @set /A val+=%d >NUL
set val=0
初始化你的变量wmic cpu get NumberOfCores /value
以列表格式检索值,更实用解析。 wmic的输出中有很多空行。 List格式为我们提供了一个可以过滤的常见字符=
。因此,^| findstr "="
。管道被转义为由for而不是shell本身捕获。set /A
允许进行计算,这里是所有找到的值的总和。此命令还输出其结果,从而输出NUL重定向。因此,在X上你得到val = 8,在y val = 12上