在再次循环或循环结束之前,Powershell输出不会显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在再次循环或循环结束之前,Powershell输出不会显示相关的知识,希望对你有一定的参考价值。

我正在为我的大学Windows客户端操作系统类编写一个powershell脚本,并且遇到一些输出无法正确显示的问题。我是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

同样,这是在while循环中的开关中。

第一次运行它没有显示任何内容,第二次或退出循环它显示: DeviceID大小可用空间 C:------------- 20 ---------- 2.29 d:0 -------------- --------------- 0 C:------------- 20 ---------- 2.29 d:0 -------------- --------------- 0

(忽略破折号我只是不知道如何在这个网站上格式化) 第三次显示信息一次,但没有上面的标题名称。

我真的不知道如何解决这个问题,我一直在寻找一个小时,而不是我真的知道我在寻找什么,任何提示?

编辑:这是整个循环:

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')
答案

我已经调整了你的代码,所以现在它将输出你在开关中为所选项目设置的任何内容。

我将cls正下方的do {移动到该循环之外,并在每个开关选项的末尾添加了一个break命令。这样可确保无论何时处理一个选项,代码都会退出交换机,并且不会继续测试下一个选项。

对于选项2,您需要确保对Select-Object之后可用的属性进行排序。由于您按名称Free Space创建了计算属性,因此需要对Sort-Object cmdlet使用相同的名称。

最后,我删除了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

希望有所帮助

以上是关于在再次循环或循环结束之前,Powershell输出不会显示的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell do while continue break循环脚本示例

在开始睡眠(或直到脚本结束)之后对象输出的奇怪延迟

php中在循环外部如何强制结束循环?

执行 PHP 循环直到数组结束或达到一定的迭代次数?

Powershell & Lotus Notes - 将 While 循环的输出从文本更改为 XML 输出

Powershell表单 - 使用按钮暂停循环