我编写了以下函数作为在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中运行它。
答案 0 :(得分: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 }