Powershell 无法根据值重命名按钮

Powershell 无法根据值重命名按钮,powershell,Powershell,如果变量等于1,则将按钮名称更改为重置;否则就把它改回原来的样子。然而,我无法使它正常工作 我尝试设置写入主机以显示变量值,并且显示正确。但是,一旦再次按下按钮,变量号将切换回原来的状态,从而导致按钮文本在按下按钮后不会改变。我还尝试删除该功能并直接在按钮代码中构建它。同样的结果 Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() $Form

如果变量等于1,则将按钮名称更改为重置;否则就把它改回原来的样子。然而,我无法使它正常工作

我尝试设置写入主机以显示变量值,并且显示正确。但是,一旦再次按下按钮,变量号将切换回原来的状态,从而导致按钮文本在按下按钮后不会改变。我还尝试删除该功能并直接在按钮代码中构建它。同样的结果

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '273,155'
$Form.text                       = "Rename_Test"
$Form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($BRename))

#Variables
$MyNumber = [int]1

Function AddNumber{
    $MyNumber = [int]$MyNumber + [int]1
    $BRename.text = "Reset"
}

Function SubNumber{
    $MyNumber = [int]$MyNumber - [int]1
    $BRename.text = "Rename"
}

Function GetNumber {
    $MyNumber
}

$BRename.Add_Click({

    if($MyNumber -eq [int]1){
        AddNumber
    }

    If($MyNumber -eq [int]2){
        SubNumber
    }

 })

 [void]$Form.ShowDialog()

请参见代码中的注释:

    Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()


# Scriptblock for button pressed

$script:MyNumber = -1

$action = {
    $script:MyNumber = -$script:MyNumber
    if( $script:MyNumber -gt 0 ) {
        $BRename.text = "Reset"
    }
    else {
        $BRename.text = "Rename"
    }
}

$form                            = New-Object system.Windows.Forms.Form
$form.Visible                    = $false
[void]$form.SuspendLayout()

$form.ClientSize                 = '273,155'
$form.text                       = "Rename_Test"
$form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'
$BRename.Add_Click( $action )    # event must asigned before showDialog!

$Form.controls.Add($BRename)

[void]$form.ResumeLayout()
$userInput = $form.ShowDialog()

请参见代码中的注释:

    Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()


# Scriptblock for button pressed

$script:MyNumber = -1

$action = {
    $script:MyNumber = -$script:MyNumber
    if( $script:MyNumber -gt 0 ) {
        $BRename.text = "Reset"
    }
    else {
        $BRename.text = "Rename"
    }
}

$form                            = New-Object system.Windows.Forms.Form
$form.Visible                    = $false
[void]$form.SuspendLayout()

$form.ClientSize                 = '273,155'
$form.text                       = "Rename_Test"
$form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'
$BRename.Add_Click( $action )    # event must asigned before showDialog!

$Form.controls.Add($BRename)

[void]$form.ResumeLayout()
$userInput = $form.ShowDialog()

原因是范围可变。更改函数内的变量不会(默认情况下)更改其父范围内的变量。因此

Function SubNumber{
    $MyNumber = [int]$MyNumber - [int]1
只会在
子编号
函数中更改
$MyNumber
,而不会更改原始编号。这非常类似于传递值示意图。其效果是,
$MyNumber
从不为2,因此从不调用减法函数

作为旁注,显式
[int]
不是必需的,在Powershell脚本中也不常见

要更改脚本范围中的变量,请在函数中使用
$script:
前缀。这样,

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '273,155'
$Form.text                       = "Rename_Test"
$Form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($BRename))

#Variables
$MyNumber = 1

function Renamed {
    switch ($script:MyNumber) { # Switch is usually better than multiple if statements
        1 { $BRename.text = "Reset"; ++$script:MyNumber }
        2 { $BRename.text = "Rename"; --$script:MyNumber }
        default  {$script:MyNumber = 1} # For unexpected values, force inital value
    }
}
$BRename.Add_Click({Renamed})

[void]$Form.ShowDialog()

原因是范围可变。更改函数内的变量不会(默认情况下)更改其父范围内的变量。因此

Function SubNumber{
    $MyNumber = [int]$MyNumber - [int]1
只会在
子编号
函数中更改
$MyNumber
,而不会更改原始编号。这非常类似于传递值示意图。其效果是,
$MyNumber
从不为2,因此从不调用减法函数

作为旁注,显式
[int]
不是必需的,在Powershell脚本中也不常见

要更改脚本范围中的变量,请在函数中使用
$script:
前缀。这样,

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '273,155'
$Form.text                       = "Rename_Test"
$Form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($BRename))

#Variables
$MyNumber = 1

function Renamed {
    switch ($script:MyNumber) { # Switch is usually better than multiple if statements
        1 { $BRename.text = "Reset"; ++$script:MyNumber }
        2 { $BRename.text = "Rename"; --$script:MyNumber }
        default  {$script:MyNumber = 1} # For unexpected values, force inital value
    }
}
$BRename.Add_Click({Renamed})

[void]$Form.ShowDialog()

我不明白你想要什么。我相应地修改了剧本。我不明白你想要什么。我相应地修改了剧本。