web-dev-qa-db-ja.com

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

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

$ FOO=BAR ./myscript

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

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

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

$ OPTION=1 ./myscript

そして

$ ./myscript

とても便利です.

67
miracle2k

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

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

環境変数$ env:FOOは、次のように後で削除できます。

Remove-Item Env:\FOO
31
Keith Hill

この問題について十分に動機付けられたので、先に進み、スクリプトを作成しました。 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
kizzx2

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
Jason R. Coombs

CMDがWindowsカーネルのネイティブCLIである(多くのツールの自動化インターフェイスである)ことを考えると、CMDプロンプトまたはCMDコンソールステートメントを受け入れるインターフェイスからpowershell.exeを使用してPowerShellスクリプトを実行できます。

-Fileパラメーターを使用してスクリプトをpowershell.exeに渡す場合、他のPowerShellコードを使用してアクセスするスクリプトの環境変数を設定することはできないため、代わりに環境変数をpowershell.exeを呼び出す前のCMD環境:

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

単一の&も機能しますが、何らかの理由でsetが失敗した場合、コマンドを続行できます。 (これも可能ですか?私にはわかりません。)

また、後続の変数が変数の内容としてsetに渡されないように、"foo=bar"を引用符で囲む方が安全かもしれません。

0
NReilingh