В Linux я могу:
$ FOO=BAR ./myscript
для вызова «myscript» с установленной переменной окружения FOO.
Возможно ли что-то подобное в PowerShell, т.е. без необходимости сначала установить переменную, вызвать команду, а затем снова сбросить переменную?
Чтобы быть более ясным в отношении моего варианта использования - я не хочу использовать это как часть сценария. Скорее у меня есть сторонний сценарий, поведение которого я могу контролировать с помощью переменных среды, но в данном случае не аргументов командной строки. Так что возможность переключаться между набором текста
$ OPTION=1 ./myscript
а также
$ ./myscript
просто было бы очень удобно.
windows
powershell
scripting
variables
environment
miracle2k
источник
источник
Ответы:
Как правило, лучше передавать информацию в сценарий через параметр, а не через глобальную переменную (среды). Но если это то, что вам нужно, вы можете сделать это следующим образом:
$env:FOO = 'BAR'; ./myscript
Переменная окружения $ env: FOO может быть удалена позже следующим образом:
источник
env:foo
возвращать старое значение (возможно, не заданное) вместо его удаления?& {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}
... некоторые могут сказать громоздко , но избежать побочных эффектов ...Я был достаточно мотивирован этой проблемой, поэтому написал для нее сценарий: 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
источник
2 простых способа сделать это одной строкой:
$env:FOO='BAR'; .\myscript; $env:FOO='' $env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO
Просто обобщила информацию из других ответов (спасибо, ребята), которые по какой-то причине не содержат однострочников.
источник
Чтобы выполнить эквивалент синтаксиса 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 подскажет, как написать такой командлет.
источник
Учитывая, что CMD является собственным интерфейсом командной строки в ядре 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
качестве содержимого переменной.источник
Вы можете добавлять переменные в функции и сценарии.
$script:foo = "foo" $foo $function:functionVariable = "v" $functionVariable
New-Variable также имеет параметр -scope, если вы хотите быть формальным и объявить свою переменную с помощью new-variable.
источник
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 = ""
источник