获取系统信息的脚本显示过多详细信息

时间:2015-05-06 19:46:59

标签: powershell

我编写了以下脚本来获取Windows系统信息,如CPU数量,CPU型号,内存和序列号

param (
    [string]$a
)

Function proc {
    Get-WmiObject Win32_processor | select -ExpandProperty NumberOfLogicalProcessors
} 

Function cpumodel {
    Get-WmiObject Win32_processor | select -ExpandProperty Name
}

Function Memory {
    Get-wmiobject Win32_ComputerSystem | select -ExpandProperty TotalPhysicalMemory
}

Function vendor {
    Get-WmiObject win32_bIOS  | select serialnumber
}

switch ($a) 
{ 
    pro {$(proc)} 
    cpu {$(cpumodel)}
    mem {$(Memory)} 
    default {$(proc);$(cpumodel);$(Memory)}
}

当我运行脚本时,得到以下结果。

PS C:\Users\Administrator> powershell .\test.ps1
2
2
Intel(R) Xeon(R) CPU           L7555  @ 1.87GHz
Intel(R) Xeon(R) CPU           L7555  @ 1.87GHz
8589467648

在上面的结果中,我想要提到一次2,下面一行要提到。

Intel(R) Xeon(R) CPU           L7555  @ 1.87GHz

并且内存查询结果以KB而不是字节显示。

现在,我来自Unix背景,并不熟悉Powershell脚本,但我正在学习。

Windows Powershell中是否有任何剪切,awk语句或我该怎么做才能获得所需的结果?

2 个答案:

答案 0 :(得分:1)

PowerShell可以处理对象,而不是像Unix shell这样的文本,因此Get-WmiObject调用会生成Select-Object cmdlet(别名select)显示特定属性的对象。如果只需要特定属性的值,则需要对其进行扩展。例如:

Get-WmiObject Win32_processor | select -Expand NumberOfLogicalProcessors

此外,您需要正确解释手头的信息。 NumberOfLogicalProcessors属性不会为您提供系统中物理处理器的数量。相反,它将为每个不支持超线程的处理器(与NumberOfCores相同)提供核心数,或者为每个支持超线程的处理器提供两倍的核心数。

引用Win32_Processor类的文档:

  

<强> NumberOfLogicalProcessors

     

数据类型: uint32
  访问类型:只读

     

当前处理器实例的逻辑处理器数。对于能够超线程处理的处理器,此值仅包括启用了超线程的处理器。有关更多信息,请参阅备注。

     

[...]

     

<强>说明

     

在多处理器计算机上,每个处理器都存在一个 Win32_Processor 类实例。

     

要确定与计算机系统对象关联的处理器实例总数,请使用Win32_ComputerSystemProcessor关联类。

     

要确定是否为处理器启用了超线程,请比较 NumberOfLogicalProcessors NumberOfCores 。如果在处理器的BIOS中启用了超线程,则 NumberOfCores 小于 NumberOfLogicalProcessors 。例如,包含两个启用超线程处理器的双处理器系统可以运行四个线程或程序或同时运行。在这种情况下, NumberOfCores 为2, NumberOfLogicalProcessors 为4。

如果你想要物理处理器的数量,只计算对象的数量Get-WmiObject返回:

@(Get-WmiObject Win32_Processor).Count

@()确保结果始终是一个数组(提供Count属性),即使只返回一个(或零)对象。

要获取唯一的处理器名称,请选择唯一的名称:

Get-WmiObject Win32_processor | select -Expand Name -Unique

要将字节值转换为千字节,您可以将值除以10241kb。使用format operator-f)相应地格式化结果值:

$mem = Get-wmiobject Win32_ComputerSystem | select -Expand TotalPhysicalMemory
'{0:f0} kB' -f ($mem / 1kb)

答案 1 :(得分:0)

我不确定你在这里说的是什么,但我认为你只需要-ExpandProperty的{​​{1}}选项,就像这样:

Select-Object