在脚本中使用 "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
命令锁定显示列, 即 Name
和 HDDs 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。
我正在尝试 运行 一个简单的脚本,其中包含逻辑磁盘的可用空间和大小信息,尽管它的输出不是我想要完成的。 我不会列出完整的脚本,因为它无关紧要,我将只列出这两个命令。
这是脚本:
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
列 到控制台 - 尽管该列(属性由如果您要以编程方式.
简而言之,您的第一个Get-WmiObject ... | Select-Object
命令锁定显示列, 即 Name
和 HDDs 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。