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

Using "Get-WmiObject" Twice in a script not working

我正在尝试 运行 一个简单的脚本,其中包含逻辑磁盘的可用空间和大小信息,尽管它的输出不是我想要完成的。 我不会列出完整的脚本,因为它无关紧要,我将只列出这两个命令。

这是脚本:

    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:  

如您所见,它使免费 space 为空。

感谢任何帮助。

如果没有特殊原因需要调用它两次,您只需一次即可获得免费 space:

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)}}

这是我的输出:

Name HDDs Total Size In GB HDDs FreeSpace
---- --------------------- --------------
C:                     146              6
E:                     205             35

Fabian Mendez's helpful answer 通过提供 single-command 解决方案绕过 问题。

至于您的症状

As you can see it leaves the Free space empty.

不,它根本不会 打印 HDDs FreeSpace 到控制台 - 尽管该列(属性由如果您要以编程方式.

检查输出,输出 objects) 上的那个名称仍然存在

简而言之,您的第一个Get-WmiObject ... | Select-Object命令锁定显示列, 即 NameHDDs Total Size In GB.

虽然 second 命令的输出有 Name 列,但缺少 HDDs Total Size In GB 列,因此没有显示任何值 - 并且 HDDs FreeSpace 列被完全 忽略

此行为 Format-Table output-formatting cmdlet 的隐式使用相关,在我的 this answer 中有详细解释。

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

警告如果您需要以编程方式处理输出,请不要执行此操作,因为Out-Host绕过PowerShell的成功(数据)输出流;虽然使用 Format-* cmdlet 仍会向成功流发送数据,但此数据不再是 input objects,而是 objects 表示格式化说明.


简化示例:

PS> [pscustomobject] @{ one=1; two=2 }; [pscustomobject] @{ one=10; three=30 } 

one two
--- ---
  1   2
 10    

请注意第 2 个 object 列 two 是空白的,它的 three 列根本不打印,因为只有 1st 输出 object 的属性决定了输出列。

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

PS> [pscustomobject] @{ one=1; two=2 } | Out-Host; [pscustomobject] @{ one=10; three=30 } 

one two
--- ---
  1   2



one three
--- -----
 10    30

请注意每个 object 的列现在是如何显示的,前面是 object-specific header。