【问题标题】:Why won't Variable update?为什么变量不会更新?
【发布时间】:2026-01-03 03:05:02
【问题描述】:

我目前正在为 AD 编辑我们的新员工脚本,但遇到了一个问题,我为主文件夹添加了 2 个单选按钮,一个单选按钮将 BaseHomeFolderPath 更新为 Path1,第二个单选按钮将其更新为 Path2,我将变量导出到 csv 以验证它是否有效,但它一直显示为空白。我不知道这是范围问题还是我做错了什么,任何帮助将不胜感激!以下是代码的副本。

我尝试使用 $script: 也没有成功。

$BaseHomeFolderPath = ''

Set-Variable -Name $BaseHomeFolderPath -Scope Global

$radiobuttonAtlas_MouseClick = [System.Windows.Forms.MouseEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.MouseEventArgs]
    #TODO: Place custom script here
    $BaseHomeFolderPath = '\\path1\users'
}


$radiobuttonCerberus_MouseClick=[System.Windows.Forms.MouseEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.MouseEventArgs]
    #TODO: Place custom script here
    $BaseHomeFolderPath = '\\path2\users'
}

$buttonRun_MouseClick=[System.Windows.Forms.MouseEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.MouseEventArgs]
    #TODO: Place custom script here
    $TestValue = New-Object System.Object
    $TestValue | Add-Member -MemberType NoteProperty -Name "Path" -Value $BaseHomeFolderPath
    $TestValue | Export-CSV -NoTypeInformation -Path "C:\Users\testuser\Desktop\Testcsv.csv"
}

我希望 BaseHomeFolderPath 变量更新为选中的单选按钮。

【问题讨论】:

    标签: powershell variables scope


    【解决方案1】:

    tl;dr

    为了更新 script 范围(或 local 以外的任何范围)中的 $BaseHomeFolderPath 变量,您必须在该范围内显式引用它:

    $script:BaseHomeFolderPath = '\\path1\users'
    

    否则,如果没有诸如 $script: 之类的范围说明符,您将在 当前 范围内以该名称隐式创建一个 new 变量,在您的情况下是您的事件处理程序运行的 子范围


    在 PowerShell 中,当您使用 $var = ... 分配给变量时,您可以:

    • 更新在同一范围内创建的预先存在的变量

    • 或在当前范围内隐式创建一个新变量

    棘手的部分是,即使子作用域看到在父作用域中创建的变量,并且只能通过名称​​获取它们的值分配给它们仅按名称创建一个,作用域局部变量,然后该新变量隐藏当前作用域中的原始变量和所有子变量范围。

    一个简单的演示,使用调用运算符& 在子范围内执行脚本块({ ... }):

    $var = 'parent'
    "in parent: before: $var"
    & {
      "in child: before: $var" # sees $var from parent scope 
      $var = 'child'           # creates new $var in current scope
      "in child: after: $var"  # sees new $var, which shadows the parent's
    }
    "in parent: after: $var"   # still has original value
    

    打印出来:

    in parent: before: parent
    in child: before: parent
    in child: after: child
    in parent: after: parent
    

    注意:

    • 除了固定-目标范围说明符$script:$global:,您可以使用Get-Variable / Set-Variable cmdlet 和-Scope 参数来定位变量在范围相对与当前范围内(在调用堆栈上)。

    • 为了促进模块化和可维护性,通常最好避免跨范围边界访问变量 - 最好改为传递 .

    有关详细信息,请参阅:

    【讨论】: