Использование "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

Обратите внимание, как теперь отображаются столбцы каждого объекта, которому предшествует специфичный для объекта заголовок.

Другие вопросы по тегам