Suppose I'm running a (power)shell on a Windows machine.
Is there a one-liner I could use to get:
- The number of physical processor cores and/or
- The max number of in-flight threads, i.e. cores * hyper-threading factor?
Note: I want just a single number as the command output, not any headers or text.
CodePudding user response:
To find out processor number of cores using PowerShell
Get-WmiObject –class Win32_processor | ft NumberOfCores,NumberOfLogicalProcessors
To find out what is the number of threads running:
(Get-Process|Select-Object -ExpandProperty Threads).Count
CodePudding user response:
Ran Turner's answer provides the crucial pointer, but can be improved in two ways:
The CIM cmdlets (e.g.,
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 allFormat-*
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 for more information).- To create objects with a subset of the input objects' properties, use the
Select-Object
cmdlet instead. (If the output object(s) have 4 or fewer properties and aren't captured, they implicitly format as ifFormat-Table
had been called; with 5 or more properties, it is implicitFormat-List
).
- To create objects with a subset of the input objects' properties, use the
Therefore:
# 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
Of course, if you're only interested in the values (CPU counts as mere numbers), you don't need the intermediate object and can omit the Select-Object
call above.
CodePudding user response:
There are several comments with similar answers. Get-WmiObject
is deprecated. Go with Get-CimInstance
. Do not use aliases in scripts. Spell commands and parameters out. Explicit is better than implicit.
Get-CimInstance –ClassName Win32_Processor | Format-Table -Property NumberOfCores,NumberOfLogicalProcessors
UPDATE:
If you want only a single number value assigned to a variable.
$NumberOfCores = (Get-CimInstance –ClassName Win32_Processor).NumberOfCores
$NumberOfLogicalProcessors = (Get-CimInstance –ClassName Win32_Processor).NumberOfLogicalProcessors