在循环中运行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。


我认为这是因为你正在混合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 }
链接地址: http://www.djcxy.com/p/30245.html

上一篇: Truncated output when running Powershell command in a loop

下一篇: Running CMD command in Powershell