#function #powershell #scope #runspace
Вопрос:
Существует модуль, в котором есть функция «инициализировать», которая задает переменную, которая используется в других сценариях/функциях модуля для проверки того, что функция инициализации была запущена. Что-то вроде
Start-InitializeThing
Connect to the API
$Script:SNOWinit = $true
Затем в другом скрипте/функции он проверит:
if ($Script:SNOWinit -eq $true) { Do the thing!}
Есть ли способ захватить этот $Script:SNOWinit в том же окне PowerShell, но не в том же модуле?
Я хочу запустить ту же проверку, но для другой функции, которой нет в модуле.
Могу ли я это сделать, могу ли я «покопаться» в пространстве запуска модулей и проверить эту переменную. У меня нет средств для редактирования функций в модуле, поэтому я не могу изменить тип переменной, установленной после запуска сценария инициализации.
Ответ №1:
Предполагая, что интересующий модуль назван foo
и что он уже был импортирован (загружен):
. (Get-Module foo) { $SNOWinit }
Если вы хотите импортировать модуль по требованию:
. (Import-Module -PassThru foo) { $SNOWinit }
- Приведенное выше возвращает значение
$SNOWinit
переменной, определенной в корневой области модуляfoo
.- Смотрите это сообщение в блоге для получения дополнительной информации.
- Обратите внимание, что обычно не рекомендуется использовать этот метод, поскольку он нарушает предполагаемую инкапсуляцию, предоставляемую модулями. В рассматриваемом случае
$SNOWinit
, как непубличная переменная модуля , должна рассматриваться как деталь реализации, поэтому вам не следует полагаться на ее присутствие в производственном коде.
Комментарии:
1. Это потрясающе! Огромное спасибо. Это сообщение в блоге было хорошим чтением. Я также ценю примечание о передовой практике. Я свяжусь с людьми, которым принадлежит модуль, и посмотрю, сможем ли мы обновить способ создания переменной.
2. Рад слышать, что это было полезно, @ErickW; мое удовольствие.
Ответ №2:
Из Библии, WPiA. Более загадочное использование для оператора вызова.
# get a variable in module scope
$m = get-module counter
amp; $m Get-Variable count
amp; $m Set-Variable count 33