Использование "Get-WmiObject" дважды в сценарии не работает
Я пытаюсь запустить простой сценарий, который содержит информацию о свободном пространстве и размере логического диска, хотя вывод этого не является тем, что я пытаюсь выполнить. Я не буду перечислять полный сценарий, поскольку он не имеет значения, я собираюсь перечислить только эти две команды.
Вот сценарий:
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 ответа
Если нет особой причины вызывать его дважды, вы можете получить свободное место всего за один раз:
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 обходит проблему, предлагая решение с одной командой.
Что касается вашего симптома:
Как видите, свободное пространство остается пустым.
Нет, он просто не печатает HDDs FreeSpace
столбец на консоль - хотя этот столбец (свойства с этим именем в выходных объектах) все еще существует, если вы должны были проверить вывод программно.
Короче говоря, твой первый Get-WmiObject ... | Select-Object
блокировка команд в столбцах дисплея, которые Name
а также HDDs Total Size In GB
,
В то время как выход второй команды имеет Name
колонка, ему не хватает HDDs Total Size In GB
столбец, поэтому для него не отображаются значения - и HDDs FreeSpace
колонка полностью игнорируется.
Это поведение, которое связано с неявным использованием Format-Table
Командлет output-formatting, подробно объясняется в этом моем ответе.
Для принудительного раздельного форматирования вывода для каждой команды используйте ... | Out-Host
или же ... | Format-*
(командлеты форматирования, такие как Format-Table
).
Предостережение: не делайте этого, если вам нужно обработать вывод программно, потому что Out-Host
обходит поток вывода PowerShell (данные); при использовании Format-*
Командлеты будут по-прежнему отправлять данные в поток успеха, эти данные больше не являются входными объектами, а представляют собой объекты, представляющие инструкции форматирования.
Упрощенный пример:
> [pscustomobject] @{ one=1; two=2 }; [pscustomobject] @{ one=10; three=30 }
one two
--- ---
1 2
10
Обратите внимание, как столбец two
пуст для второго объекта и его three
column не печатает вообще, потому что только свойства 1-го выходного объекта определяют выходные столбцы.
Благодаря явному использованию Out-Host
или командлет форматирования, вы можете принудительно отформатировать две команды:
> [pscustomobject] @{ one=1; two=2 } | Out-Host; [pscustomobject] @{ one=10; three=30 }
one two
--- ---
1 2
one three
--- -----
10 30
Обратите внимание, как теперь отображаются столбцы каждого объекта, которому предшествует специфичный для объекта заголовок.