You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell WinForms按钮点击事件重复执行问题求助

PowerShell GUI按钮点击事件重复执行问题解决

问题原因

你每次点击$Button1时,都会执行$OKButton16.add_Click(...)为该按钮添加一个新的点击事件处理器。多次点击$Button1后,$OKButton16上会绑定多个相同的事件,导致点击它时触发所有绑定的事件,代码执行次数等于点击$Button1的次数。

解决方案

方案1:提前绑定事件(推荐)

将$OKButton16的点击事件绑定逻辑移到$Button1的点击事件外部,仅在初始化$OKButton16时绑定一次事件,避免重复绑定。

# 提前初始化OKButton16并绑定点击事件(仅执行一次)
$OKButton16 = New-Object System.Windows.Forms.Button
# 补充OKButton16的其他初始化配置(如Text、Location等)
$OKButton16.add_Click({
    $ConsoleTextbox.AppendText("More text appended")
    Invoke-Command -ComputerName $Mycomputer -Credential $Credentials -ScriptBlock {Restart-Service -Name "*spool*" -Force} -AsJob -JobName JOB1
    $ConsoleTextbox.AppendText("`n")
    $ConsoleTextbox.AppendText("Appending more text")
    $ConsoleTextbox.AppendText("`n")
    $ConsoleTextbox.AppendText("`n")
    $main_form.Controls.Remove($OKButton16)
    $main_form.Controls.Remove($CancelButton)
    $Button1.Enabled = $true
})

# 初始化Button1及其点击事件
$Button1 = New-Object System.Windows.Forms.Button 
$Button1.Text = 'Computername' 
$Button1.Location  = New-Object System.Drawing.Point(30,70) 
$Button1.Size = New-Object System.Drawing.Size(130,65) 
$Button1.add_Click({
    $Button1.Enabled = $False
    $ConsoleTextbox.Text = ""  # 原代码$ConsoleTextbox.Text = cls错误,改为空字符串清空文本框
    $ConsoleTextbox.AppendText("My text appended")
    $main_form.Controls.Add($OKButton16)
    $main_form.Controls.Add($CancelButton)
})

方案2:绑定前移除旧事件

如果必须在$Button1的点击事件内绑定$OKButton16的事件,可先移除已存在的事件处理器,再添加新的。需要将事件处理器定义为变量,方便后续移除。

$Button1 = New-Object System.Windows.Forms.Button 
$Button1.Text = 'Computername' 
$Button1.Location  = New-Object System.Drawing.Point(30,70) 
$Button1.Size = New-Object System.Drawing.Size(130,65) 

# 定义OK按钮的事件处理器变量
$okClickHandler = {
    $ConsoleTextbox.AppendText("More text appended")
    Invoke-Command -ComputerName $Mycomputer -Credential $Credentials -ScriptBlock {Restart-Service -Name "*spool*" -Force} -AsJob -JobName JOB1
    $ConsoleTextbox.AppendText("`n")
    $ConsoleTextbox.AppendText("Appending more text")
    $ConsoleTextbox.AppendText("`n")
    $ConsoleTextbox.AppendText("`n")
    $main_form.Controls.Remove($OKButton16)
    $main_form.Controls.Remove($CancelButton)
    $Button1.Enabled = $true
    # 执行后移除自身事件,防止后续误触发
    $OKButton16.remove_Click($okClickHandler)
}

$Button1.add_Click({
    $Button1.Enabled = $False
    $ConsoleTextbox.Text = ""
    $ConsoleTextbox.AppendText("My text appended")
    # 尝试移除旧事件,无旧事件时忽略错误
    try { $OKButton16.remove_Click($okClickHandler) } catch {}
    # 绑定新事件
    $OKButton16.add_Click($okClickHandler)
    $main_form.Controls.Add($OKButton16)
    $main_form.Controls.Add($CancelButton)
})

额外修正

原代码中$ConsoleTextbox.Text = cls是错误用法,cls是PowerShell清屏命令,清空文本框内容应直接赋值为空字符串""。

内容的提问来源于stack exchange,提问作者Ruben M S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:12:46