我正在尝试运行一个简单的脚本,其中包含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:
正如您所看到的,它将空闲空间留空。
感谢任何帮助。
答案 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
注意每个对象的列现在如何显示,前面是特定于对象的标题。