Выходные данные Powershell не отображаются до тех пор, пока цикл не пройдет снова или цикл не закончится - PullRequest
1 голос
/ 12 апреля 2019

Я пишу сценарий powershell для своего класса ОС Windows Client колледжа, и у меня возникла проблема с некоторыми выводами, которые отображаются неправильно. Я очень плохо знаком с сценариями PowerShell и даже не знаю, что они могут выпускать. Код находится в цикле do / while и переключателе для создания меню, но вывод не отображается при выборе опции меню. Однако при повторном выборе параметра меню часть информации отображается дважды, затем при выборе этого параметра третий раз отображается информация один раз, но без заголовка, и продолжает делать это каждый раз после этого.

Это код:

cls
Get-WMIObject Win32_Logicaldisk | Select DeviceID,
@{Name="Size";Expression={$_.Size/1GB -as [int]}},
@{Name="Free Space";Expression={[math]::Round($_.Freespace/1GB,2)}}
Sort FreeGB | Format-Table –AutoSize

Опять же, это в переключателе, который находится в цикле do while.

При первом запуске он ничего не отображает, во второй раз или при выходе из цикла отображается следующее:
DeviceID Размер свободного пространства
С: ------------- 20 ---------- 2,29
D: -------------- 0 --------------- 0
C: ------------- 20 ---------- 2,29
D: -------------- 0 --------------- 0

(игнорировать черточки, я просто не знаю, как форматировать на этом сайте)
В третий раз он отображает информацию один раз, но без заголовков над ней.

Я действительно не знаю, как это исправить, и я искал час, а не то, чтобы я действительно знал, что я ищу в любом случае, какие-либо намеки?

EDIT: Вот весь цикл:

do {

cls
Show-Menu   
$input = Read-Host "Select 1-9"
switch ($input)   
{
    '1' {
        cls
        Write-Host "Computer Name:" $env:computername | Select-Object
        Write-Host "OS Version:" ([Environment]::OSVersion.VersionString) 
    }
    '2' { # Modified From: https://www.petri.com/checking-system-drive-free-space-with-wmi-and-powershell
        cls
        Get-WMIObject Win32_Logicaldisk | Select DeviceID,
        @{Name="Size";Expression={$_.Size/1GB -as [int]}},
        @{Name="Free Space";Expression={[math]::Round($_.Freespace/1GB,2)}}
    }
    '3' {

    }
    '4' {

    }
    '5' {

    }
    '6' {

    }
    '7' {

    }
    '8' {

    }
    '9' {
        return
    }
}
pause } while ($input -ne '9')

1 Ответ

0 голосов
/ 14 апреля 2019

Я настроил ваш код так, что теперь он будет выводить все, что вы установили в переключателе для выбранного элемента.

Я переместил cls, который был прямо под do {, за пределы этого цикла и добавил break Команда в конце каждой опции переключателя. Это гарантирует, что всякий раз, когда обрабатывается одна опция, код выходит из коммутатора и не продолжает тестировать следующую опцию.

Что касается варианта 2, вам необходимо убедиться, что вы сортируете свойство, которое доступно после Select-Object. Поскольку вы создали вычисляемое свойство по имени Free Space, вам нужно использовать с тем же именем для командлета Sort-Object.

Наконец, я удалил команду pause, потому что она избыточна.

cls
do {
    $input = Read-Host "Select 1-8 (press 9 to quit)"
    switch ($input) {
        '1' {
                cls
                Write-Host "Computer Name:" $env:computername | Select-Object
                Write-Host "OS Version:
                " ([Environment]::OSVersion.VersionString) 
                Write-Host
                break
            }
        '2' { # Modified From: https://www.petri.com/checking-system-drive-free-space-with-wmi-and-powershell
                cls
                Get-WMIObject Win32_Logicaldisk | Select-Object DeviceID,
                    @{Name="Size";Expression={$_.Size/1GB -as [int]}},
                    @{Name="Free Space";Expression={[math]::Round($_.Freespace/1GB,2)}} | 
                    Sort-Object -Property 'Free Space' | 
                    Format-Table
                break
            }
        '3' { break }
        '4' { break }
        '5' { break }
        '6' { break }
        '7' { break }
        '8' { break }
    }
} while ($input -ne '9')

Пример вывода для варианта 2 на моей машине (голландский числовой формат, поэтому он использует десятичную запятую):

DeviceID Size Free Space
-------- ---- ----------
F:          0          0
G:          0          0
C:        233      91,61
E:        466     309,22
D:        699     396,05

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

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