在循环中运行Powershell命令时截断输出

时间:2016-10-21 04:22:03

标签: windows powershell

我编写了以下函数作为在Powershell中实现* nix watch命令的基本功能的基本方法:

function watch {
    Param(
        [Parameter(Mandatory=$true)][string]
        $command,
        [Parameter(Mandatory=$false)][int]
        $n = 2
    )

    while($true) {
        clear
        Write-Output (iex $command)
        sleep $n
    }
}

使用返回Powershell对象的cmdlet时,我会遇到奇怪的行为。例如,如果我运行`watch'get-command ls',在第一次迭代时我得到对象的以下格式化输出:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ls -> Get-ChildItem

但是在第二次和后续迭代中,它会截断对象属性标题(以及某些其他命令中它上面的任何描述):

Alias           ls -> Get-ChildItem

我很好奇为什么会出现这种情况,以及如何使输出与所有后续迭代的第一次迭代相同。我在Windows 10的Powershell 5.1中运行它。

1 个答案:

答案 0 :(得分:1)

我认为这是因为你正在混淆Write-Output写入管道,clear正确命名为Clear-Host并清除本地终端,并且对管道一无所知。使用Write-Host会更好。

由于你的函数永远循环,管道输出永远不会完成,所以你得到的是这个无穷无尽的列表,有一组标题:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ls -> Get-ChildItem
Alias           ls -> Get-ChildItem
Alias           ls -> Get-ChildItem
Alias           ls -> Get-ChildItem
Alias           ls -> Get-ChildItem
Alias           ls -> Get-ChildItem

但你清除了列表中间的/ display /,因此它会继续打印后续项目而不带标题。

如果您在命令中明确写入Format-Table,则可以重复标题:

watch { Get-Alias ls | Format-Table }