2016-08-16 58 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

肖恩改變了他的答案,就像這一樣。他應該在他的答案中重新添加他的原始解決方案。 –