2016-10-21 68 views
0

我寫了下面的功能在PowerShell中執行的* nix watch命令的基本功能的一個基本方式:截斷輸出循環運行PowerShell命令時

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的工作,我得到奇怪的行爲。例如,如果我跑'看「得命令ls」的,在第一次迭代I獲取對象的下列格式化輸出:

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

但在第二次和後續的迭代,它截斷對象屬性的頭文件(並在某些其他命令它上面的任何說明):

Alias   ls -> Get-ChildItem 

我很好奇,爲什麼這種行爲發生,我怎樣才能使輸出相同的所有後續的迭代的第一次迭代。我在PowerShell中5.1在Windows上運行這個10

+0

因爲'格式Table'你含蓄管道輸出不知道你清楚的屏幕,它只是* *繼續**打印表格,不打印新表格。 – PetSerAl

回答

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 

但你清除/顯示/在中間該列表,因此它將繼續打印後續項目而不包含標題。

如果你明確地寫在你的命令Format-Table你可以得到的標題重複:

watch { Get-Alias ls | Format-Table } 
+0

我實際上在沒有將寫輸出和iex結合的情況下得到了相同的行爲,我將寫輸出思想結合起來考慮它可以解決問題,但仍然得到相同的行爲。我將添加格式表 –

+0

好消息,Format-Table正是我所需要的。謝謝! –