为什么不更新变量?

时间:2019-03-28 17:21:00

标签: powershell variables scope

我目前正在编辑用于AD的新员工脚本,遇到一个问题,我为主文件夹添加了两个单选按钮,一个单选按钮会将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变量更新为选中的任何单选按钮。

1 个答案:

答案 0 :(得分:0)

tl; dr

为了更新 script 范围内的$BaseHomeFolderPath变量,必须在该范围内明确引用它:

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

否则,您将在运行事件处理程序的子作用域中通过该名称隐式创建一个 local变量。


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

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

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

棘手的部分是,即使子作用域请参见在父作用域中创建的变量,并且只能按名称​​获取其值将其分配给它们仅按名称创建一个 new 范围本地变量,然后该新变量阴影覆盖在当前范围中的原始变量和所有子对象范围。

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

$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

有关更多信息,请参见: