PowerShell:単一のコマンドのみの環境変数を設定する


99

Linuxでは、次のことができます。

$ FOO=BAR ./myscript

環境変数FOOを設定して「myscript」を呼び出す。

PowerShellでも同様のことが可能ですか?つまり、最初に変数を設定し、コマンドを呼び出してから、変数を再度設定解除する必要はありませんか?

私の使用例をより明確にするために、これをスクリプトの一部として使用したくありません。むしろ、環境変数を使用して動作を制御できるサードパーティのスクリプトがありますが、この場合はコマンドライン引数ではありません。だからタイピングを交互にできること

$ OPTION=1 ./myscript

そして

$ ./myscript

とても便利です。


私の質問は、なぜこれを行う必要があるのでしょうか?もっと良い解決策があると思います。
EBGreen

20
@EBGreen、それは通常役立つ質問ではありません。この機能がUNIXシェルにあるという事実は、その使用法があることを示唆しています。私の頭の上の部分:gitがコミットに使用するユーザー名と電子メールアドレスの制御。これらのコマンドラインオプションはありません。これらは、〜/ .gitconfig、各リポジトリの.git / config、またはenvarsで設定する必要があります。これらのオプションのうち、envarsはオンザフライで設定するのが明らかに簡単です(ファイルの値を簡単にオーバーライドできます)。それで、Powershellで「git commit」の著者名を変更したい場合は、どうすればよいですか?
マークリード

2
なぜこれが必要なのかを尋ねるのは無意味であることに完全に同意します。Linuxのコマンドラインで実行する場合はborschtと同じように一般的であり、今やpowershell(存在する場合は構文上の悪夢)に悩まされている私たちは、明白な手法に対する答えを常に検索する必要があります。ほとんどの場合、些細なことをするために長いスクリプトを書くことを数えない限り、それらはpowershellに存在しません。私はその殻に深く不満を感じています...
Kim


1
@FranklinYuのリンクに感謝しますが、現時点では、v7.0以降のそれほど遠くない将来のバージョンでうまくいくと思います。
mklement0

回答:


54

一般に、グローバル(環境)変数ではなくパラメーターを介してスクリプトに情報を渡す方が適切です。しかし、それが必要な場合は、次の方法で行うことができます。

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

環境変数$ env:FOOは後で削除できます。

Remove-Item Env:\FOO

2
ちょっと考えてみましょう。新しいPowerShellプロセスを作成し、-Commandパラメーターを介してスクリプトブロックをそこに渡しませんか。そうすれば、後で環境をクリーンアップする必要がなくなります。環境は子プロセスに含まれるからです。私はPowerShell MVPと話しているので、これはおそらく機能しません:-)
Joey

2
キース、まさにこのシナリオのために、Pscxにpush-environmentblockとpop-environmentblockがあります;-)
x0n

2
ヨハネス、それもうまくいくでしょうが、どういうわけか浮気のようです。:-) PSCX Push / Pop-EnvironmentBlock(がこの方法で機能させるため変更したもの)は機能しますが、スクリプトブロックが持っている自動クリーンアップサポートがありません。
キース・ヒル

1
env:foo削除する代わりに、古い値(おそらく未設定)に戻す必要はありませんか?
2016年

1
@Joeyが述べたようにあなたがしたい場合は、ENVはきれいvarsは、あなたはできます& {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}...一部は言うかもしれない扱いにくい ...が、副作用を避けることができます
ルーカス

13

この問題について十分にやる気が出て、先に進み、そのためのスクリプトを作成しました: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

4

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環境変数セット...そしてそれは、コマンドの実行後にリセット(あるいは未設定)を取得します。

おそらく、1回の呼び出しでこのアドホックを実行することもできます。

& { $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の第一人者が、そのようなコマンドレットの記述方法を提案できるでしょう。


3

1行でそれを行う2つの簡単な方法:

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

何らかの理由で純粋なワンライナーが含まれていない他の回答(ありがとう)からの情報を要約しただけです。


0

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あります。



-5

変数のスコープを関数とスクリプトに設定できます。

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

New-Variableには、正式になり、new-variableを使用して変数を宣言する場合、-scopeパラメーターもあります。


1
うーん...この答えがここに当てはまるとは思わないでください。PowerShell変数は環境変数ではありません。質問に基づいて、アスカーは環境変数をスクラッチスペースとして使用していません(CMDの場合と同様(この場合、この答えが当てはまります))、外部コマンドを呼び出す前に環境を操作してから復元する必要がありますその後の環境(またはその効果のための何か)。
chwarr、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.