プロセスが終了した後に使用できるコンソール アプリケーションで環境変数を永続化することは可能ですか。
コンソール アプリケーションで、それを実行したバッチ ファイルで使用できる文字列を設定する必要があります。
コンソール アプリケーションは dotnet にあります。
プロセスが終了した後に使用できるコンソール アプリケーションで環境変数を永続化することは可能ですか。
コンソール アプリケーションで、それを実行したバッチ ファイルで使用できる文字列を設定する必要があります。
コンソール アプリケーションは dotnet にあります。
Environment.SetEnvironmentVariableを使用できます。
Environment.SetEnvironmentVariable("SomeVariable", "Some value", EnvironmentVariableTarget.User);
最後のパラメーターは、変数 (プロセス、ユーザー、またはマシン) のスコープと有効期間を決定します。マシンの変数を設定する場合は、管理者として実行する必要があります。
編集:上記のコードでコンソール アプリケーションを実行する場合、新しいコマンド ウィンドウを開くまで環境変数を使用できないことに気付きました (そのため、バッチ ファイルからコンソール アプリケーションを実行する場合、環境変数は使用できません)。見える環境変数のセットを更新するトリックがない限り、バッチ ファイル)。
編集 2: OK、私はこれを掘り下げていましたが、バッチ ファイルに更新された環境変数のセットを取得させる明らかな方法はないようです。私が見つけた 1 つの回避策は、変数自体を設定するのではなく、.net コードで変数を設定するためのバッチ ファイルを作成することです。呼び出し元のバッチ スクリプトは、作成されたバッチ ファイルを実行して、環境をセットアップできます。
.Net コンソール アプリ:
static void Main(string[] args)
{
string outputFile = @"c:\temp\setvars.bat";
string variable = "set SomeVariable=Some value";
File.WriteAllText(outputFile, variable);
}
BAT ファイル:
call myconsoleapp.exe
call c:\temp\setvars.bat
echo %SomeVariable%
これは、Xiaofu のものと似ていますが、テキスト ファイルを完全にスキップして、プログラムでデータをコンソールに書き込むことができる点が異なります。次のように、プログラム名の周りに目盛りを付けて、バッチ ファイルで実行し、出力を使用します。
for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
set %%a=%%b
set %%a=%%b
)
無視する必要がある他のテキスト行を出力する場合は、for ループ内にフィルターを追加できます。
バッチ ファイルで読み取れるようにするため、従来の環境変数の使用に制限されている可能性があります。
User または MachineのEnvironmentVariableTargetでEnvironment.SetEnvironmentVariableを使用してみてください。その後、%my_var% のようなものを使用して、バッチ ファイルから取得できるはずです。
Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User);
編集: Fredrik は、同様の解決策で私を打ち負かしました。これは、環境変数の既知の動作であることに同意します。C# アプリで、返したい文字列をテキスト ファイルに書き込み、それをバッチ ファイルで解析することを提案するつもりでした。例えば:
for /f "tokens=1,2 delims=," %%a in (data.txt) do (
if %%a==env1 echo %%b
if %%a==env2 echo %%b
)
... data.txt は次のようになります。
env1,hello
env2,there
はい、プロセス環境変数の代わりにシステム環境変数を設定します。(技術的には、ユーザー環境変数も保持されると思いますが、そのユーザーのコンテキストに対してのみです)。
system.environment クラスを使用して SetEnvironmentVariable メソッドを取得します。