1

呼び出し元のシェル (cmd.exe) のインスタンスに環境変数を設定するプログラムを書きたいと思います。アイデアは、この変数に何らかの状態を保存し、その後の呼び出しで再度使用できるということです。

SetEnvironmentVariable のようなコマンドがあることは知っていますが、それらは現在のプロセスの変数のみを変更し、呼び出し元のシェルの変数を変更しないことを理解しています。

具体的には、2 つのディレクトリ間を移動できるコマンドを作成したいと考えています。Pushd/Popd はディレクトリに移動して戻ることができますが、最初にプッシュされたディレクトリに 2 回目を戻す方法はありません。

4

4 に答える 4

6

MSDN は次のように述べています

呼び出しSetEnvironmentVariableは、システム環境変数には影響しません。システム環境変数をプログラムで追加または変更するには、それらを HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environmentレジストリ キーに追加してから、文字列 "Environment" に設定されたWM_SETTINGCHANGEメッセージをブロードキャストします。lParamこれにより、シェルなどのアプリケーションが更新を取得できるようになります。このキーにリストされている環境変数の値は、1024 文字に制限されていることに注意してください。

環境にはシステムとプロセスの 2 つのレベルがあることを考慮すると、シェルでそれらを変更すると、別のプロセスの環境を変更することになります。これが可能だとは思いません。

于 2009-04-21T19:04:53.373 に答える
3

Windows では、あるプロセスが別のプロセスを作成するときに、子プロセスに現在の環境文字列を継承させるか、新しい子プロセスに変更された、または完全に新しい環境を与えることができます。

CreateProcess() win32 APIの完全な情報を参照してください。

子プロセスが親プロセスに戻って親の環境を変更する方法はサポートされていません。

そうは言っても、CMD スクリプトと PowerShell を使用すると、親コマンド シェルは子プロセスから出力を取得し、独自の環境を更新できます。これは一般的な手法です。

個人的には、複雑な CMD スクリプトは好きではありません。デバッグを書くのは面倒です。これは PowerShell で行うことをお勧めします。確かに習得には時間がかかりますが、はるかに豊富です。

于 2009-04-21T19:03:29.647 に答える
3

一般的な手法は、スクリプトから「呼び出される」env ファイルを作成することです。

del env.var
foo.exe ## writes to env.var
call env.var
于 2009-04-21T19:36:18.633 に答える