我正在学习PowerShell作为Windows管理的一部分,我有一些问题。我需要为各种系统运行sysinfo命令,并从输出中选取OS Name
,OS Version
,Total 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
答案 0 :(得分:1)
运行systeminfo -?
表示该命令支持格式选项。使用CSV格式,您可以让PowerShell直接导入输出:
systeminfo -fo CSV | ConvertFrom-Csv
这将返回包含OS Name
,Host 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"
需要在引号中,因为它包含空格。