[windows] PowerShell : 단일 명령에 대해서만 환경 변수 설정

Linux에서는 다음을 수행 할 수 있습니다.

$ FOO=BAR ./myscript

환경 변수 FOO를 설정하여 “myscript”를 호출합니다.

PowerShell에서도 비슷한 것이 가능합니까? 즉, 먼저 변수를 설정하고 명령을 호출 한 다음 변수를 다시 설정 해제 할 필요가 없습니까?

내 사용 사례에 대해 더 명확하게하기 위해 스크립트의 일부로 사용하고 싶지 않습니다. 오히려 환경 변수를 사용하여 동작을 제어 할 수있는 타사 스크립트가 있지만이 경우에는 명령 줄 인수가 아닙니다. 그래서 타이핑을 번갈아 가며

$ OPTION=1 ./myscript

$ ./myscript

매우 편리합니다.



답변

일반적으로 전역 (환경) 변수보다는 매개 변수를 통해 스크립트에 정보를 전달하는 것이 좋습니다. 그러나 그것이 당신이해야 할 일이라면 다음과 같이 할 수 있습니다.

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

환경 변수 $ env : FOO는 나중에 다음과 같이 삭제할 수 있습니다.

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


답변

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실행 후 재설정 (또는 설정 해제)됩니다.

아마도 단일 호출에 대해이 임시 작업을 수행 할 수도 있습니다.

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

이보다 더 쉬울 수 있지만 분명히 PowerShell에서 쉽게 지원되는 사용 사례는 아닙니다. 향후 버전 (또는 타사 기능)이이 사용 사례를 용이하게 할 것입니다. PowerShell에이를 수행하는 cmdlet이 있으면 좋을 것입니다. 예 :

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

아마도 PowerShell 전문가는 그러한 cmdlet을 작성하는 방법을 제안 할 수 있습니다.


답변

한 줄로하는 두 가지 쉬운 방법 :

$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO

어떤 이유로 든 순수한 한 줄짜리가 포함되지 않은 다른 답변 (감사합니다)의 요약 정보입니다.


답변

CMD가 Windows 커널의 기본 CLI (여전히 많은 도구에 대한 자동화 인터페이스 임)라는 점을 고려 powershell.exe하면 CMD 프롬프트 또는 CMD 콘솔 문을 허용하는 인터페이스에서 PowerShell 스크립트를 실행할 수 있습니다 .

-File매개 변수를 사용 하여 스크립트를에 전달 하는 경우 powershell.exe다른 PowerShell 코드를 사용하여 스크립트에 액세스 할 환경 변수를 설정할 수 없으므로 대신 다음을 호출하기 전에 CMD 환경에서 환경 변수를 설정할 수 있습니다 powershell.exe.

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

싱글 &도 작동하지만 set어떤 이유로 실패한 경우 명령을 계속할 수 있습니다. (이것도 가능합니까? 모르겠습니다.)

또한 변수 내용으로 "foo=bar"다음 내용이 전달되지 않도록 따옴표 로 묶는 것이 더 안전 할 수 있습니다 set.


답변

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       = ""


답변

변수의 범위를 함수와 스크립트로 지정할 수 있습니다.

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

New-Variable에는 형식화하고 new-variable을 사용하여 변수를 선언하려는 경우 -scope 매개 변수도 있습니다.