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
を実行できるようになり、実行後にリセット(または設定解除)されますコマンドの。
おそらく、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の第一人者は、そのようなコマンドレットの作成方法を提案できるでしょう。
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"
を引用符で囲む方が安全かもしれません。