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