Переменные в PowerShell - PullRequest
       22

Переменные в PowerShell

3 голосов
/ 25 февраля 2010

У меня есть переменная, которая является общей для большинства моих приложений и называется «электронная почта».Я также хочу использовать «электронные письма» в качестве имени параметра в одном из сценариев.Мне нужно сослаться на значение обеих переменных в одном и том же скрипте.В идеале был бы способ ссылаться с использованием модуля / пространства имен или чего-то еще, и, возможно, есть, но я этого не знаю.Вы можете видеть, как я взломал это, но это уродливо и склонно к ошибке.Есть ли лучший способ?

# PowerShell v1
# Some variable names are very common.
param ($emails)

# My Hack
# We need to save current value so we have it after we source in variables below.
$emails0=$emails

# Below is going to load a variable called "emails" which will overwrite parm above.
. C:\load_a_bunch_of_global_variables.ps1

Ответы [ 4 ]

7 голосов
/ 25 февраля 2010

Это потому, что в документации сказано: (оператор точечного поиска) Запускает сценарий, чтобы элементы в сценарии были частью вызывающей области.

В этом случае я бы преобразовал C:\load_a_bunch_of_global_variables.ps1 в модуль и передал $emails в качестве параметра или экспортировал функцию, которая устанавливает переменную $script:emails в модуле. Тогда переменная не будет конфликтовать с переменной в родительском скрипте.

Для получения дополнительной информации о модулях вы можете использовать get-help about_modules.


Я бы по возможности не использовал глобальные переменные в моих скриптах.

Почему? Потому что это запах кода (как говорят программисты). С одним скриптом проблем нет. Если два скрипта используют одну и ту же глобальную переменную и только для чтения, это может быть приемлемо. Но если кто-то из них изменит значение, могут возникнуть неприятные конфликты.

В некоторых случаях Get-Variable -scope 1 -name myvariable может помочь, но я бы использовал его только в закрытых частях кода, таких как модули или в коротких скриптах (по той же причине, что и с глобальными переменными).

2 голосов
/ 25 февраля 2010

Хотя вы можете использовать Get-Variable -scope для получения доступа к переменным на произвольных уровнях стека вызовов, в этом случае проще получить переменную верхнего уровня (к сценарию), используя скрипт: модификатор, например.

$script:emails
1 голос
/ 25 февраля 2010

повторный запуск и stej оба помогли мне.

Я все еще хочу найти источник в файле, используя ". File.ps1", но изменив "$emails=foo@yahoo.com" в моем файле load_a_bunch_of ... ps1 на "$ global: emails=foo@yahoo.com "решил проблему. Теперь я могу ссылаться на переменную, используя глобальное ключевое слово, когда у меня есть локальная и глобальная переменная, и когда есть только одна переменная, с которой я могу работать, я могу опустить ключевое слово global.

0 голосов
/ 25 февраля 2010

Вы всегда можете получить доступ к своим глобальным переменным из скрипта, используя $ global: var name внутри вашего скрипта, у вас есть локальная область, и вы не столкнетесь с конфликтами. Если ты . Исходя из вашего скрипта вы переопределите глобальный var.

Например, если есть сценарий

$Crap ="test"
$Crap

И, выполняя текущие команды, вы получаете то, что хотите. В строке 2 мы запускаем скрипт, и var не получает конфликта, но если вы запускаете скрипт, как в строке 4 с помощью. Источник вы получаете то, что вы обнаруживаете, что благодаря пути. оператор работает

1:PS C:\Users\Adam> $crap = "hi"
2:PS C:\Users\Adam> .\test.ps1
test
3:PS C:\Users\Adam> $crap 
hi
4:PS C:\Users\Adam> . .\test.ps1
test
5:PS C:\Users\Adam> $crap
test
6:PS C:\Users\Adam>

если вы добавите следующую строку в скрипт, запустите его

$global:crap;

вы получите

PS C:\Users\Adam> .\test.ps1
test
hi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...