如何从PowerShell中的命令输出中选取选择字段?

时间:2014-08-15 09:59:31

标签: powershell

我正在学习PowerShell作为Windows管理的一部分,我有一些问题。我需要为各种系统运行sysinfo命令,并从输出中选取OS NameOS VersionTotal Physical Memory和其他字段。我的问题是输出不是PowerShell对象,所以我不能使用基于属性的处理。我该怎么办才能只获取这些字段?我尝试使用findstr,但是对于像Hotfix这样具有多个值的字段,它只会拾取第一行。

命令

systeminfo /S <IP Address> /U Administrator /P <Password>

输出:

    Host Name:                 TEST
    OS Name:                   Microsoft Windows Server 2008 R2 Standard
    OS Version:                6.1.7601 Service Pack 1 Build 7601
    OS Manufacturer:           Microsoft Corporation
    OS Configuration:          Standalone Server
    OS Build Type:             Multiprocessor Free

3 个答案:

答案 0 :(得分:1)

运行systeminfo -?表示该命令支持格式选项。使用CSV格式,您可以让PowerShell直接导入输出:

systeminfo -fo CSV | ConvertFrom-Csv

这将返回包含OS NameHost Name等属性的自定义PSObject,您可以使用引号访问(Matt mentioned in his answer):$csv.'OS Name'


供参考,以下是systeminfo -?在我的机器上显示的内容:

SYSTEMINFO [/S system [/U username [/P [password]]]] [/FO format] [/NH]

Description:
    This tool displays operating system configuration information for
    a local or remote machine, including service pack levels.

Parameter List:
    /S      system           Specifies the remote system to connect to.

    /U      [domain\]user    Specifies the user context under which
                             the command should execute.

    /P      [password]       Specifies the password for the given
                             user context. Prompts for input if omitted.

    /FO     format           Specifies the format in which the output
                             is to be displayed.
                             Valid values: "TABLE", "LIST", "CSV".

    /NH                      Specifies that the "Column Header" should
                             not be displayed in the output.
                             Valid only for "TABLE" and "CSV" formats.

    /?                       Displays this help message.

Examples:
    SYSTEMINFO
    SYSTEMINFO /?
    SYSTEMINFO /S system
    SYSTEMINFO /S system /U user
    SYSTEMINFO /S system /U domain\user /P password /FO TABLE
    SYSTEMINFO /S system /FO LIST
    SYSTEMINFO /S system /FO CSV /NH

答案 1 :(得分:0)

我知道我可以更好地回答这个问题,但至少会有一个开始:

$file = systeminfo
$file | Where-Object{($_ -like "OS*") -or ($_ -like "Host Name:*")}

将systeminfo捕获到一个变量(数组)中,该变量可以通过管道输入Where-Object来解析您要查找的数据

输出:

Host Name:                 TE_ST
OS Name:                   Microsoft Windows 7 Enterprise 
OS Version:                6.1.7601 Service Pack 1 Build 7601
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free

我试图把它变成一个适当的对象来改善我的答案

答案 2 :(得分:0)

我正在做出另一个答案,试图不要忘记我的第一个答案的简单性。继续:

$sysInfo= systeminfo
$output = $sysInfo | 
        Where-Object{($_ -like "OS*") -or ($_ -like "Host Name:*")} | 
        ForEach-Object{ $_ -replace ":\s+"," = "}
ConvertFrom-StringData($output | Out-String)

同样,systeminfo被捕获到变量$sysInfo中。在$output中捕获所需的输出。

这次我使用ForEach-Object -replace ":\s+"," = "运行替换每一行。原因是我要将文本转换为哈希表,这是一系列name = value。正则表达式替换将冒号和任何后续空格更改为=

$ output的类型为System.Object[]。但是我们需要它在我的示例中是一个字符串,它可以放入ConvertFrom-StringData,这就是我们将$ output输出到Out-String的原因。

据说你得到以下内容:

Name                           Value                                                                  
----                           -----                                                                  
OS Manufacturer                Microsoft Corporation                                                  
OS Version                     6.1.7601 Service Pack 1 Build 7601                                     
OS Configuration               Member Workstation                                                     
OS Name                        Microsoft Windows 7 Professional                                       
Host Name                      C4093                                                                  
OS Build Type                  Multiprocessor Free        

您现在可以使用powershell cmd-lets

$osInfo = ConvertFrom-StringData($output | Out-String)
$osInfo."Os Name"

"Os Name"需要在引号中,因为它包含空格。