Ответ Мануэля Батшинга показывает, как использовать точечный источник для решения вашей проблемы косвенно : путем выполнения дочернего сценария непосредственно в родительском область действия сценария , все переменных дочернего сценария (уровня сценария) (среди прочих определений, а именно функций и псевдонимов) создаются непосредственно в области действия родительского сценария, что может быть нежелательно.
PowerShell предлагает механизмы для выборочного изменения переменных в других областях , но лучше их избегать , поскольку вы создаете тесную связь между вашим сценарии, которые затрудняют их обслуживание; Вместо этого используйте другой механизм для обмена информацией между вашими сценариями, в простейшей форме через output .
Если вы все еще хотите решить свою проблему, изменив переменную в родительской области, вы можете используйте следующее:
# When run in child.ps1 that was invoked (normally) by parent.ps1,
# sets $count to 1 in the scope of *parent.ps1*.
Set-Variable -Scope 1 -Name count -Value 10
Scope -1
относится к родительской области действия вызывающей области (2
относится к прародителю области и т. д. on) - см. Set-Variable
.
Дополнительно, модификаторы области действия $script:
и $global:
могут использоваться с именами переменных для назначения переменных в ) сценарий область действия и глобальная область действия (например, $script:foo = 'bar'
может использоваться для установки переменной уровня сценария изнутри функции , определенной в тот же сценарий; следует избегать создания или изменения глобальных переменных, поскольку они задерживаются даже после выхода из сценария) - см. about_Scopes
.
для полноты картины :
Модификатор объема $local:
позволяет явно обращаться к текущей (локальной) области видимости; он используется редко, потому что текущая область действия подразумевается , когда вы присваиваете переменной с простым именем (например, $foo = 'bar'
создает локальный $foo
переменная).
Однако при получение переменной $local:foo
не обязательно совпадает с $foo
: из-за Dynami в PowerShell c scoping, $foo
возвращает значение переменной в наследственной области , если таковая имеется, если такой переменной не существует в current объем; напротив, $local:foo
строго возвращает значение переменной с этим именем в области действия current , если она там определена.
To suppress dynamici c определение области видимости для данной переменной, т. е. для предотвращения ее видения (по умолчанию) из областей потомка создайте ее с помощью модификатора области действия $private:
.
См. этот ответ для получения дополнительной информации о динамических параметрах PowerShell c и области действия $private:
.
Модификатор области действия $using:
используется в контексте remoting и jobs ; на самом деле он не ссылается на переменную как таковую в контексте вызывающей стороны, но имеет значение - см. about_Remote_Variables
.