PowerShell: настройка переменной среды только для одной команды - PullRequest
63 голосов
/ 14 сентября 2009

В Linux я могу сделать:

$ FOO=BAR ./myscript

для вызова «myscript» с установленной переменной среды FOO.

Возможно ли нечто подобное в PowerShell, то есть без необходимости сначала устанавливать переменную, вызывать команду, а затем снова сбрасывать переменную?

Чтобы быть более понятным в моем случае использования - я не хочу использовать это как часть сценария. Скорее, у меня есть сторонний скрипт, чьим поведением я могу управлять с помощью переменных окружения, но в данном случае это не аргументы командной строки. Таким образом, возможность чередовать набрав

$ OPTION=1 ./myscript

и

$ ./myscript

было бы очень удобно.

Ответы [ 6 ]

28 голосов
/ 14 сентября 2009

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

$env:FOO = 'BAR'; ./myscript

Переменная среды $ env: FOO может быть удалена позже так:

Remove-Item Env:\FOO
3 голосов
/ 23 января 2018

Я был достаточно мотивирован об этой проблеме, и я написал для нее сценарий: with-env.ps1

Использование:

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

С другой стороны, если вы установите Gow , вы можете использовать env.exe, который может быть немного более надежным, чем быстрый скрипт, который я написал выше.

Использование:

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command
3 голосов
/ 20 января 2011

Чтобы выполнить эквивалент синтаксиса Unix, вам нужно не только установить переменную среды, но и сбросить ее прежнее значение после выполнения команды. Я выполнил это для общих команд, которые я использую, добавив функции, подобные приведенным ниже, в свой профиль PowerShell.

function cmd_special()
{
  $orig_master = $env:app_master
  $env:app_master = 'http://host.example.com'
  mycmd $args
  $env:app_master = $orig_master
}

Итак, mycmd - это некоторый исполняемый файл, который работает по-разному в зависимости от значения переменной окружения app_master. Определив cmd_special, я теперь могу выполнить cmd_special из командной строки (включая другие параметры) с установленной переменной среды app_master ... и она будет сброшена (или даже неустановлена) после выполнения команды.

Предположительно, вы также можете сделать это ad-hoc для одного вызова.

& { $orig_master = $env:appmaster; $env:app_master = 'http://host.example.com'; mycmd $args; $env:app_master = $orig_master }

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

with-env app_master='http://host.example.com' mycmd

Возможно, гуру PowerShell может подсказать, как можно написать такой командлет.

0 голосов
/ 14 марта 2019

https://gist.github.com/bobalob/6632690e33747c13a8c00875ee686be2

$ENV:ARM_SUBSCRIPTION_ID = ""
$ENV:ARM_CLIENT_ID       = ""
$ENV:ARM_CLIENT_SECRET   = "" # This should end with an '=' symbol
$ENV:ARM_TENANT_ID       = ""
0 голосов
/ 15 ноября 2018

Учитывая, что CMD является собственным CLI в ядре Windows (и все еще является интерфейсом автоматизации для многих инструментов), возможно, вы выполняете сценарий PowerShell с powershell.exe из приглашения CMD или интерфейс, который принимает операторы консоли CMD .

Если вы используете параметр -File для передачи сценария в powershell.exe, другой код PowerShell нельзя использовать для установки переменной среды для доступа к сценарию, поэтому вместо этого вы можете установить переменные среды в CMD среда перед звонком powershell.exe:

> set foo=bar && powershell.exe -File .\script.ps1

Один & также будет работать, но позволит команде продолжиться, если по какой-то причине не удалось set. (Возможно ли это? Я понятия не имею.)

Кроме того, может быть безопаснее заключить в кавычки "foo=bar", чтобы ничего не передавалось set в качестве содержимого переменной.

0 голосов
/ 14 сентября 2009

Вы можете использовать переменные в функциях и скриптах.

$script:foo = "foo"
$foo
$function:functionVariable = "v"
$functionVariable

New-Variable также имеет параметр -scope, если вы хотите быть формальным и объявить свою переменную с помощью new-variable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...