Изменение переменной в родительском скрипте с использованием дочернего скрипта в powershell - PullRequest
1 голос
/ 27 февраля 2020

У меня есть два сценария powershell. Я должен назначить родительскую переменную с помощью дочернего сценария. Дочерний сценарий powershell вызывается с использованием родительского сценария powershell

parent.ps1

$count = $Null

child.ps1

$count = 10

Как мне убедиться, что изменение в дочернем скрипте отражено в родительском скрипте?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Ответ Мануэля Батшинга показывает, как использовать точечный источник для решения вашей проблемы косвенно : путем выполнения дочернего сценария непосредственно в родительском область действия сценария , все переменных дочернего сценария (уровня сценария) (среди прочих определений, а именно функций и псевдонимов) создаются непосредственно в области действия родительского сценария, что может быть нежелательно.

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.

1 голос
/ 27 февраля 2020

Используя оператор точечного поиска ., вы можете запустить сценарий child.ps1 в той же области, что и сценарий parent.ps1. Это сохранит все изменения в переменных, которые делает ваш дочерний скрипт (см .: область действия скрипта и точечный источник ).

Пусть содержимое вашего parent.ps1 будет таким:

$count = $null
. .\child.ps1
$count

Это вернет 10.

...