Почему переменная не обновляется? - PullRequest
1 голос
/ 28 марта 2019

В настоящее время я редактирую наш новый сценарий сотрудника для 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 будет обновлена ​​в зависимости от того, какой переключатель выбран.

1 Ответ

0 голосов
/ 28 марта 2019

ТЛ; др

Чтобы обновить переменную $BaseHomeFolderPath в области действия script , необходимо явно указать ее в этой области:

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

В противном случае вы неявно создадите новую локальную переменную с этим именем в дочерней области, в которой работают ваши обработчики событий.


В PowerShell, когда вы назначаете переменную с помощью $var = ..., вы либо:

  • обновить существующую переменную, которая была создана в той же области .

  • или неявно создайте новую переменную в текущей области действия .

Сложность в том, что, хотя дочерние области см. переменные, созданные в родительских областях и могут получать их значения только по имени, присваивать им по имени только создает новую , локальную переменную области действия , и эту новую переменную затем shadows исходную переменную в текущей области и все дочерние области.

Простая демонстрация с использованием оператора вызова & для выполнения блока скрипта ({ ... }) в дочерней области:

$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

Для получения дополнительной информации см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...