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
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