使用" Get-WmiObject"脚本中有两次无效

时间:2018-02-04 16:24:37

标签: powershell powershell-ise

我正在尝试运行一个简单的脚本,其中包含Logical Disk的FreeSpace和Size信息,但这并不是我想要完成的输出。 我不会列出完整的脚本,因为它不相关,我将仅列出这两个命令。

以下是脚本:

    Get-WmiObject -Class win32_logicaldisk | select -Property Name , @{n='HDDs Total Size In GB';e={[math]::Round($_.size/1gb)}}


Get-WmiObject -Class Win32_logicalDisk | select -Property Name , @{n='HDDs FreeSpace';e={[math]::Round($_.FreeSpace/1gb)}}

这是输出:

    Name HDDs Total Size In GB
---- ---------------------
C:                     111
D:                     932
E:                     932
C:                        
D:                        
E:  

正如您所看到的,它将空闲空间留空。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果没有特别的理由两次调用它,你可以只用一个获得可用空间:

com.samsung

这是我的输出:

Get-WmiObject -Class win32_logicaldisk | select -Property Name , @{n='HDDs Total Size In GB';e={[math]::Round($_.size/1gb)}}, @{n='HDDs FreeSpace';e={[math]::Round($_.FreeSpace/1gb)}}

答案 1 :(得分:0)

Fabian Mendez's helpful answer 通过提供单一命令解决方案来绕过问题。

至于您的症状

  

正如您所看到的,它将空闲空间留空。

不,它只是打印 HDDs FreeSpace到控制台 - 尽管该列(输出对象上该名称的属性)仍然如果您要以编程方式检查输出 ,则存在。

简而言之,您的第一个 Get-WmiObject ... | Select-Object命令锁定显示列,即Name和{ {1}}。

虽然第二个命令的输出有一个HDDs Total Size In GB列,但它没有Name列,因此没有显示任何值 - 而HDDs Total Size In GB列是忽略

此行为(与隐式使用HDDs FreeSpace输出格式化cmdlet 有关)在我的this answer中有详细解释。

要为每个命令强制使用单独的输出格式,请使用Format-Table... | Out-Host (格式化cmdlet,例如... | Format-*)。

警告如果您需要以编程方式处理输出 ,请执行此操作,因为{{1 } 旁路 PowerShell的成功(数据)输出流;使用Format-Table cmdlet时仍会将数据发送到成功流,此数据不再是输入对象,而是表示格式化指令的对象。

简化示例:

Out-Host

请注意,对于第二个对象,列Format-*是空白的,并且其> [pscustomobject] @{ one=1; two=2 }; [pscustomobject] @{ one=10; three=30 } one two --- --- 1 2 10 列根本不打印,因为只有 1st 输出对象的属性确定了输出列

通过显式使用two或格式化cmdlet,您可以强制单独格式化两个命令:

three

注意每个对象的列现在如何显示,前面是特定于对象的标题。