Как получить переменную из пространства выполнения модуля в PowerShell?

#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