2016-08-16 53 views
-1

我想重复* nix watch功能,如johnrizzo1here所提供的。如何强制隐含的PowerShell格式表重复标题重复输出?

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 

所有其他PS解决watch在上面的链接从有同样的问题的方式。

回答

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' 
+0

这适用于临时命令,我可以增加明确的格式-表。这不适用于通用命令。 –

+0

因此,表头被写入一次,然后你清理屏幕来做一些事情PowerShell并不是真的。 –

+0

玩得开心, –

1

这很可能还有其他的问题,但简单地改变

$cmd.invoke(); 

$cmd.invoke() | ft; 

作品对我来说

+0

所以在ScriptBlock中应该有'ft'(正如Shawn Esterman建议的那样)或'watch'代码中。这个解决方案是可以接受的,但对我来说并不好看。 –

+1

肖恩改变了他的答案,就像这一样。他应该在他的答案中重新添加他的原始解决方案。 –