我在互联网上找到了一个代码,使用函数代码来使文本闪烁。我在我的pwershell应用程序中使用该函数。但我希望闪烁的代码在后台运行。 功能是
$function = {
function Blink-Message {
param([String]$Message,[int]$Delay,[int]$Count,[ConsoleColor[]]$Colors)
$startColor = [Console]::ForegroundColor
$startLeft = [Console]::CursorLeft
$startTop = [Console]::CursorTop
$colorCount = $Colors.Length
$line = "$message"
for($i = 0; $i -lt $Count; $i++) {
[Console]::CursorLeft = $startLeft
[Console]::CursorTop = $startTop
[Console]::ForegroundColor = $Colors[$($i % $colorCount)]
[Console]::WriteLine($Message)
Start-Sleep -Milliseconds $Delay
}
[Console]::ForegroundColor = $startColor
}
}
# Set-Alias blink Blink-Message
#write-host -NoNewline "hello "; Blink-Message "blink" 1000 15 "red,black" | Receive-Job
write-host -NoNewline "hello1 "; start-job -InitializationScript $function -ScriptBlock {Blink-Message} -InputObject "blink1",1000,15,"red,black" | Receive-Job
write-host -NoNewline "hello2 "; start-job -InitializationScript $function -ScriptBlock {Blink-Message} -InputObject "blink2",1000,15,"red,black" | Receive-Job
write-host -NoNewline "hello3 "; start-job -InitializationScript $function -ScriptBlock {Blink-Message} -InputObject "blink3",1000,15,"red,black" | Receive-Job
任何建议表示赞赏。
感谢。
答案 0 :(得分:0)
这似乎工作正常。比我想象的要好(基本上有两个线程同时写入控制台并且它们不同步,这通常是不可预测的行为的一个配方)。
我添加了$ x和$ y参数。 $ x是您希望闪烁消息所在的列。$ y是提示当前所在行的行数。如果你使$ y小于$host.ui.rowui.windowsize.height
,那么看起来最好。如果你这样做,闪烁的消息就在屏幕的顶部。否则,只要控制台滚动,闪烁的消息就会在多行上结束。请注意,此脚本仅在POWERSHELL.EXE上进行测试。它肯定不适用于powershell_ise。
在写这篇文章的时候,我多次崩溃/挂了powershell。每次运行脚本时,它都会创建一个将保持“正在运行”状态的作业(即使在$ count指定的所有重复都已完成之后)。在后台运行多个作业,可能所有写入屏幕的内容都可能是您要避免的。 jobless
功能将删除所有作业。
function Blink-Message {
param([String]$Message,[int]$Delay,[int]$Count,[ConsoleColor[]]$Colors,$x=0,$y=0)
$script:colorCount = $Colors.Length
$script:theColors = $colors
$script:theCount = $count
$script:msg = $Message
$script:col = $x
$script:deltarow = $y
$tmr = new-object timers.timer $Delay
$tmr.AutoReset = $true
$tmr.Enabled = $true
$script:cnt = 0
$null = Register-ObjectEvent $tmr -EventName Elapsed -Action {
param( $sender)
$curColor = [Console]::ForegroundColor
$curLeft = [Console]::CursorLeft
$curTop = [Console]::CursorTop
[Console]::CursorLeft = $col
if ([Console]::CursorTop -lt -$deltarow) {
[Console]::CursorTop = 0
} else {
[Console]::CursorTop += $deltarow
}
[Console]::ForegroundColor = $theColors[$($cnt % $colorCount)]
[Console]::WriteLine($msg)
[Console]::CursorLeft = $curLeft
[Console]::CursorTop = $curTop
[Console]::ForegroundColor = $curColor
if ($script:cnt++ -ge $theCount) {
try {$sender.Enabled=$false} catch{wh send catch}
}
}
}
Set-Alias blink Blink-Message
blink "$("="*30) gabby foo" 100 100 "green","black","yellow","darkblue" 0 -79
#
# Use jobless to kill all jobs
function jobless { get-job;get-job|Stop-Job -pass | Remove-Job}