如何强制隐含的 PowerShell 格式表重复标头以进行重复输出?

问题描述 投票:0回答:3

我正在尝试重复 *nix

watch
johnrizzo1 here 提供的功能。

function Watch {
    [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='High')]
    param (
        [Parameter(Mandatory=$False,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [int]$n = 10,

        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [string]$command
    )
    process {
        $cmd = [scriptblock]::Create($command);
        While($True) {
            Clear-Host;
            Write-Host "Command: " $command;
            $cmd.Invoke();
            sleep $n;
        }
    }
}

Export-ModuleMember -function Watch

watch -n 1 '$PSVersionTable.PSVersion'

问题是只有第一次运行才显示标题。之后看起来很丑,因为标题被从输出中删除:

Command:  $PSVersionTable.PSVersion                                     
5      0      10586  117

顺便说一句,上面链接中

watch
的所有其他 PS 解决方案都遇到同样的问题。

powershell formatting
3个回答
1
投票

这现在可以工作了,但是您的输出被迫通过管道传输到 Format-Table,因此它将始终采用表格式。

function Watch {
    [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='High')]
    param (
        [Parameter(Mandatory=$False,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [int]$n = 10,

        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [string]$command
    )
    process {
        $cmd = [scriptblock]::Create($command)
        While($True) {
            Clear-Host
            Write-Host "Command: " $command
            $cmd.Invoke() | Format-Table -HideTableHeaders:$false
            sleep $n
        }
    }
}

watch -n 1 '$PSVersionTable.PSVersion'

1
投票

很可能这还有其他问题,但只是改变

$cmd.invoke();

$cmd.invoke() | ft;

对我有用


0
投票

试试这个 - 通过 -RepeatHeader 参数传送命令。

$cmd.Invoke() | Format-Table -RepeatHeader:$true

对于我的问题,我在每个 PS 命令之间清除屏幕,Powershell 仅在第一次运行时显示表标题。 -RepeatHeader 参数旨在当输出填满整个页面时重新呈现表头,并在每个页面上重新呈现表头。就我的目的而言,在 Clear-Host 命令之后在同一脚本块中重新运行相同的命令时,它起作用了

function Watch {
[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='High')]
param (
    [Parameter(Mandatory=$False,
               ValueFromPipeline=$True,
               ValueFromPipelineByPropertyName=$True)]
    [int]$n = 10,

    [Parameter(Mandatory=$True,
               ValueFromPipeline=$True,
               ValueFromPipelineByPropertyName=$True)]
    [string]$command
)
process {
    $cmd = [scriptblock]::Create($command)
    While($True) {
        Clear-Host
        Write-Host "Command: " $command
        $cmd.Invoke() | Format-Table -RepeatHeader:$true
        sleep $n
    }
}

}

watch -n 1 '$PSVersionTable.PSVersion'

© www.soinside.com 2019 - 2024. All rights reserved.