Powershell 标准输出流:一次 1 个字符

Powershell stdout stream: 1 char at a time

PS 中许多命令的输出如此突然地转储到显示器上,我什至不记得我输入了什么命令。我必须向上滚动几页才能看到。

是否可以减慢输出流的速度,以便我们可以在它经过屏幕时阅读它? ..即使它是一个错误,如果它出现在文明和可读的流中,比如 C-SPAN 上的隐藏式字幕,我们甚至可以更好地理解看似无聊的消息......

"More" 有效,但一次是整页。

我也在 techrepublic 上找到了这个:

function EasyView { process { $_; Start-Sleep -seconds .5}}

Get-ChildItem C: | EasyView 

这很酷,但它一次输出 1 条完整记录..

我正在寻找流式传输,例如每 .5 秒 1 个字母。就像在 Matrix 中一样,或者更好的是在 War Games with Matthew Broderick...

有什么想法吗?

绝不是完美的,但我在这里玩只是为了好玩,试图安抚你对我来说奇怪但好奇的需求

function get-easyview{

    param([int]$Milliseconds= 50)
    $text = $input | Out-String 

    [char[]]$text | ForEach-Object{
        Write-Host -NoNewline $_
        # Only break for a non-whitespace character.
        if($_ -notmatch "\s"){Sleep -Milliseconds $Milliseconds}
    }
}

Get-ChildItem | get-easyview -Milliseconds 50

这将获取输入对象并将其转换为单个字符串,然后将其大小写为 char 数组。然后它将痛苦地一次显示一个字符,字符之间有X毫秒的间隔。我想用几秒钟射自己的脸。我听到我脑子里有一台打字机在看着这个。 注意:这仅输出到主机控制台,而不是标准输出流。这必须是最后一个管道命令。这个没有可用的-passthru

找不到参考,但 PowerShell 只能这么慢。我认为我无法在 1-20 毫秒之间获得明显差异的睡眠。我可能对数字有误,但这是一回事。

输出与屏幕上完全不一样。我在做这个工作。

别忘了More

或等效的 PowerShell out-host -paging。使用 输入 您可以 "absorb" 按您自己的节奏获取信息。从 this answer

阅读 更多

Get-EasyView 2.0

我玩得更多了,我想设置一个开关,这样你就可以使用一些简单的参数按字符或行进行。

function get-easyview{

    param(
        [int]$Milliseconds= 50,
        [ValidateSet("Line","Character")] 
        [String] 
        $Pace = "Character"
    )

    If($pace -eq "Character"){
        $text = [char[]]($input | Out-String)
        $parameters = @{NoNewline = $true}
    } Else {
        $text = ($input | out-string) -split "`r`n"
        $parameters = @{NoNewline = $false}
    }

    $text | ForEach-Object{
        Write-Host $_ @parameters
        if($_ -notmatch "^\s+$"){Sleep -Milliseconds $Milliseconds}
    }
}

所以现在你可以这样打电话了

Get-ChildItem | get-easyview -Milliseconds 50
Get-ChildItem | get-easyview -Milliseconds 1000 -Pace Line
Get-ChildItem | get-easyview -Milliseconds 50 -Pace Character