Powershell, если в пределах foreach - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь получить некоторую информацию о моих жестких дисках, используя PowerShell (кстати, очень плохо знакомый с PS).

При расчете занятости накопителей некоторые накопители не смонтированы и возвращают размер 0. Поэтому мне нужно ввести условие, при котором накопитель с размером 0 не должен вычислять занятость.

$fmt = "{0,-5} | {1,-18} | {2,12:N2} | {3,21:N2} | {4,17:p} | {5,-15}"
$docc = { if ( $_.size -ne "0" ) { (($_.size-$_.freespace)/$_.size)} else {"0"} }
Get-WmiObject Win32_logicaldisk | foreach -begin {
     $fmt -f "Unit","File System","Capacity(GO)", `
         "Available Space(GO)","Occupancy","Observation" } {
     $fmt -f $_.deviceID, $_.FileSystem, ($_.size/1GB), `
         ($_.freespace/1GB), $docc, ""}

Предыдущий код будет возвращать if только как строку, не интерпретируя ее (даже без использования переменной).

1 Ответ

2 голосов
/ 23 ноября 2011

Вам необходимо выполнить скрипт-блок, содержащийся в $docc - я использую оператор вызова (&) ниже.Блок скриптов также не имеет доступа к $_, поэтому я передаю его в качестве параметра.

$fmt = "{0,-5} | {1,-18} | {2,12:N2} | {3,21:N2} | {4,17:p} | {5,-15}"
$docc = { param($item); if ( $item.size -gt 0 ) {
     (($item.size-$item.freespace)/$item.size)} else {"0"} }

Get-WmiObject Win32_logicaldisk | foreach -begin {
     $fmt -f "Unit","File System","Capacity(GO)", `
         "Available Space(GO)","Occupancy","Observation" } {
     $fmt -f $_.deviceID, $_.FileSystem, ($_.size/1GB), `
         ($_.freespace/1GB), (& $docc $_), ""}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...