如何在后台运行闪烁的文本代码

时间:2013-07-17 14:45:50

标签: powershell

我在互联网上找到了一个代码,使用函数代码来使文本闪烁。我在我的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

任何建议表示赞赏。

感谢。

1 个答案:

答案 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}