Powershell BalloadTip:具有开始作业的单例变量和代码块?

Powershell BalloadTip:具有开始作业的单例变量和代码块?,powershell,singleton,jobs,Powershell,Singleton,Jobs,我需要以两种不同的方式使用气球头。 1:在我的主代码中,作为配置问题未正确解决的警告。 2:在监视环境变量以显示消息的单独作业流程中。原因是Autodesk Revit处理其日志文件的方式异常。无论如何 考虑到我在两个地方做完全相同的事情,有一个函数是有意义的,并且考虑到我需要将函数传递给作业,使用代码块也是有意义的。然而,我也希望每一条新信息都能取代最后一条,而不是等待褪色。所以我需要使用$balloottip.Dispose。然而,这仅在只有一个全局$balloottip时有效,基本上是一个

我需要以两种不同的方式使用气球头。 1:在我的主代码中,作为配置问题未正确解决的警告。 2:在监视环境变量以显示消息的单独作业流程中。原因是Autodesk Revit处理其日志文件的方式异常。无论如何

考虑到我在两个地方做完全相同的事情,有一个函数是有意义的,并且考虑到我需要将函数传递给作业,使用代码块也是有意义的。然而,我也希望每一条新信息都能取代最后一条,而不是等待褪色。所以我需要使用
$balloottip.Dispose
。然而,这仅在只有一个全局$balloottip时有效,基本上是一个单例。但是它必须是可变的,所以$balloottip作为常量或代码块的闭包对我来说都没有意义。 在本例中,我只是引用父范围中的变量,但我想知道是否有更好的方法。尤其是在工作方面。或者根据定义,一个作业是否创建了一个完全不同的范围,没有共享变量的机会,我应该只在作业中实现相同的场景。从功能上讲,如果显示错误bt,由作业驱动的气球提示将永远不会显示。事实上,这项工作从未创造出来。但这是这个实现所特有的,我想象一种情况,在这种情况下,我可能真的想拥有一个$balloottip,甚至是由两个不同的工作驱动的潜力

Add-Type -assemblyName:System.Windows.Forms
$balloonTip = New-Object System.Windows.Forms.NotifyIcon


    $messageArguments = @{
        icon = [System.Drawing.Icon]::ExtractAssociatedIcon($(Get-Process -id:$pid | Select-Object -expandProperty:Path))
        btIcon = 'Info'
        btTitle = 'Test'
        btText = "$env:userName $(Get-Date)"
    }


    $sendMessage = {
        param (
            [System.Drawing.Icon]$icon,
            [String]$btIcon,
            [String]$btTitle,
            [String]$btText
        )

        $balloonTip.Dispose

        $balloonTip.Icon = $icon
        $balloonTip.balloonTipIcon = $btIcon
        $balloonTip.balloonTipTitle = $btTitle
        $balloonTip.balloonTipText = $btText

        $balloonTip.visible = $true 
        $balloonTip.showBalloonTip(0)
    }

    $a=0
    do {
        & $sendMessage @messageArguments
        Start-Sleep -s:3
    } While (++$a -le 5)
不仅要回答PetSerAl的问题,而且要扩展我自己,我有一些我认为可以工作的代码,在工作范围内使用$balloottip变量。但它似乎不起作用。问题可能在通过的代码块中,因此我修改了标题以反映扩展的问题

$sendMessage = {
    param (
        [System.Drawing.Icon]$icon,
        [String]$btIcon,
        [String]$btTitle,
        [String]$btText
    )

    $balloonTip.Icon = $icon
    $balloonTip.balloonTipIcon = $btIcon
    $balloonTip.balloonTipTitle = $btTitle
    $balloonTip.balloonTipText = $btText

    $balloonTip.visible = $true 
    $balloonTip.showBalloonTip(0)
}


function Start-MessageJob {
    [CmdletBinding()]   
    param (  
        [Int]$id,
        [ScriptBlock]$sendMessage
    )

    Start-Job -name:Messages -argumentList:@($id, $sendMessage) -scriptBlock {
        param (  
            [Int]$id,
            [ScriptBlock]$sendMessage
        )

        Add-Type -assemblyName:System.Windows.Forms  

        if ($balloonTip) {
            $balloonTip.Dispose
        } else {
            $balloonTip = New-Object System.Windows.Forms.NotifyIcon
        }

        $messageArguments = @{
            icon = [System.Drawing.Icon]::ExtractAssociatedIcon($(Get-Process -id:$id | Select-Object -expandProperty:Path))
            btIcon = 'Info'
            btTitle = 'Test'
            btText = $null
        }


        do {
            $messageArguments.btText = "$env:userName $(Get-Date)"
            & $sendMessage @messageArguments
            Start-Sleep -s:5

        } while (Get-Process -id:$id -errorAction:silentlyContinue)
    } > $null
}


Start-MessageJob -id:$pid -sendMessage:$sendMessage

我写这段代码是为了显示弹出窗口

function Show-BalloonTip {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param
    (
        [Parameter(Mandatory=$true)]
            $Title,
        [Parameter(Mandatory=$true)]
            $Text,
        [ValidateSet('None', 'Info', 'Warning', 'Error')]
            $Icon = 'Info',
            $Timeout = 10000
    )
    remove-Job -Name BalloonTip -State Completed -ea 0
    Start-Job -name BalloonTip -ScriptBlock {
    param ($Title, $Text, $Icon, $Timeout)
        Add-Type -AssemblyName System.Windows.Forms

        $balloon = New-Object System.Windows.Forms.NotifyIcon

        switch($icon){
            Warning {
                $balloon.Icon = [System.Drawing.SystemIcons]::Warning
                Write-Host "$([char]7)" # beep sound
            }
            Error {
                $balloon.Icon = [System.Drawing.SystemIcons]::Error
                Write-Host "$([char]7)" # beep sound
            }
            default {
                #Define the icon for the system tray
                $balloon.Icon = [System.Drawing.SystemIcons]::Information
            }
        }
        #Type of balloon icon
        $balloon.BalloonTipIcon = $Icon

        #Display title of balloon window
        $balloon.BalloonTipTitle = $Title
        #Notification message
        $balloon.BalloonTipText = $Text
        #Make balloon tip visible when called
        $balloon.Visible = $True
        #Call the balloon notification
        $balloon.ShowBalloonTip($Timeout)
        Start-Sleep -Milliseconds $Timeout
        $balloon.Dispose()
    } -ArgumentList @($Title, $Text, $Icon, $Timeout)
}

我写这段代码是为了显示弹出窗口

function Show-BalloonTip {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param
    (
        [Parameter(Mandatory=$true)]
            $Title,
        [Parameter(Mandatory=$true)]
            $Text,
        [ValidateSet('None', 'Info', 'Warning', 'Error')]
            $Icon = 'Info',
            $Timeout = 10000
    )
    remove-Job -Name BalloonTip -State Completed -ea 0
    Start-Job -name BalloonTip -ScriptBlock {
    param ($Title, $Text, $Icon, $Timeout)
        Add-Type -AssemblyName System.Windows.Forms

        $balloon = New-Object System.Windows.Forms.NotifyIcon

        switch($icon){
            Warning {
                $balloon.Icon = [System.Drawing.SystemIcons]::Warning
                Write-Host "$([char]7)" # beep sound
            }
            Error {
                $balloon.Icon = [System.Drawing.SystemIcons]::Error
                Write-Host "$([char]7)" # beep sound
            }
            default {
                #Define the icon for the system tray
                $balloon.Icon = [System.Drawing.SystemIcons]::Information
            }
        }
        #Type of balloon icon
        $balloon.BalloonTipIcon = $Icon

        #Display title of balloon window
        $balloon.BalloonTipTitle = $Title
        #Notification message
        $balloon.BalloonTipText = $Text
        #Make balloon tip visible when called
        $balloon.Visible = $True
        #Call the balloon notification
        $balloon.ShowBalloonTip($Timeout)
        Start-Sleep -Milliseconds $Timeout
        $balloon.Dispose()
    } -ArgumentList @($Title, $Text, $Icon, $Timeout)
}

你说的工作是什么意思?您正在谈论后台作业(
启动作业
)?
启动作业
生成单独的PowerShell进程来承载作业。如果要在它们之间共享活动对象(如
NotifyIcon
),则需要不同类型的作业。在这种情况下是什么类型的“作业”?第二批代码中有什么想法吗?在那个例子中,我并没有试图共享$balloottip变量,只是传递实际的balloottip代码块,这似乎不起作用。您需要作业,它使用进程内运行空间而不是单独的进程,例如。作业是什么意思?您正在谈论后台作业(
启动作业
)?
启动作业
生成单独的PowerShell进程来承载作业。如果要在它们之间共享活动对象(如
NotifyIcon
),则需要不同类型的作业。在这种情况下是什么类型的“作业”?第二批代码中有什么想法吗?在那个例子中,我并没有试图共享$balloottip变量,只是传递实际的balloottip代码块,这似乎不起作用。