【C#】Windowsの環境変数を一時的に変更する方法


この記事はプロモーションを含みます。

C#

C#を使って、Windowsの環境変数を一時的に変更する方法を解説します。
環境変数をアプリケーションの実行中のみ変更し、システム全体への影響を避ける方法について説明します。

はじめに

Windowsの環境変数を一時的に変更したい場合、通常はシステム全体に影響を与えるため注意が必要です。
しかし、C#を使用することで、プログラムの実行中のみ環境変数を変更し、システム全体に影響を与えずに済みます。
この記事では、その方法について詳しく説明します。

まず、C#で環境変数を変更するためには、System.Environmentクラスを使用します。
このクラスのSetEnvironmentVariableメソッドを使って、環境変数を設定することができます。
変更した環境変数は、プログラムが終了するまで有効であり、システムや他のアプリケーションには影響を与えません。

環境変数が変更されていることの確認

ここでは、環境変数が変更されていることを確認します。
以下のような簡単なフォームアプリを作成してみました。
環境変数の設定ボタンをクリックすることで、「TEST」という環境変数に「sample」という値を設定します。
環境変数のクリアボタンをクリックすると、設定した環境変数から値を削除します。
また、設定が反映されているかを確認するため、設定前後の値を出力しています。

設定した環境変数がアプリ以外にも適用されているかを確認するため、
環境変数が設定されている状態で、コマンドプロンプトで以下のコマンドを実行してみました。

C:\Workspace>echo %TEST%
%TEST%

上記より、環境変数はアプリ内のみで適用されていることが分かります。

環境変数の確認方法については以下で解説しています。

ソースコード

以下は、前項「環境変数が変更されていることの確認」で使用したフォームアプリのコードです。

using System.Diagnostics;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.AppendText("環境変数の設定前:" + ExecuteCommand("echo %TEST%") + "\n");

            // 環境変数 TEST を新しい値で設定
            Environment.SetEnvironmentVariable("TEST", "sample", EnvironmentVariableTarget.Process);
            richTextBox1.AppendText("環境変数 TEST に 'sample' が設定されました。" + "\n");

            richTextBox1.AppendText("環境変数の設定後:" + ExecuteCommand("echo %TEST%") + "\n\n");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.AppendText("環境変数のクリア前:" + ExecuteCommand("echo %TEST%") + "\n");

            // 必要に応じて、環境変数を元に戻す
            Environment.SetEnvironmentVariable("TEST", null, EnvironmentVariableTarget.Process);
            richTextBox1.AppendText("環境変数 TEST がクリアされました。" + "\n");

            richTextBox1.AppendText("環境変数のクリア後:" + ExecuteCommand("echo %TEST%") + "\n\n");
        }

        private static string ExecuteCommand(string command)
        {
            // コマンドを実行するためのプロセス情報を設定
            ProcessStartInfo processStartInfo = new("cmd.exe", "/c " + command)
            {
                // 出力をリダイレクト
                RedirectStandardOutput = true,
                // シェルを使用しない
                UseShellExecute = false,
                // ウィンドウを作成しない
                CreateNoWindow = true
            };

            // プロセスを開始
            Process process = new()
            {
                StartInfo = processStartInfo
            };
            process.Start();

            // コマンドの実行結果を取得
            string output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return output.Trim();
        }
    }
}

上記のコードでは、Environment.SetEnvironmentVariableメソッドの3つ目の引数にEnvironmentVariableTarget.Processを使用してプロセスの環境変数を変更しています。
この方法であれば、アプリケーション内でのみ変更が適用され、システム全体には影響を与えません。
引数を省略した場合も同様の動きとなりますが、環境によってはシステム全体の設定が変更される可能性もあるので、明示的に指定することを推奨します。

環境変数の適用範囲を変更する

Environment.SetEnvironmentVariableメソッドの3つ目の引数を変更することで、環境変数の適用範囲を変更することが可能です。
設定可能な値は以下のようなものがあります。

設定値説明
EnvironmentVariableTarget.Machineシステム全体の環境変数が設定されます。
つまり、すべてのユーザーやプロセスに影響を与えます。
この操作は管理者権限が必要で、システムの再起動後にも変数が持続します。
EnvironmentVariableTarget.Userユーザー固有の環境変数に設定されます。
これはシステム全体には影響せず、指定したユーザーのプロファイルに保存されます。
この変更も再起動後に有効です。
EnvironmentVariableTarget.Process環境変数を現在のプロセス内でのみ変更されます。
プロセスが終了するまで有効で、プロセスが終了すると環境変数の変更も消失します。
これにより、他のプロセスやシステム全体には影響を与えません。
つまり、他のプログラムやコマンドプロンプトからはアクセスできません。

まとめ

C#を使用してWindowsの環境変数を一時的に変更する方法は簡単で、システムに影響を与えないため、特定のアプリケーションで環境変数を変更したい場合に非常に便利です。
この方法を利用することで、環境変数の管理がより柔軟に行えるようになります。

あわせて読みたい

コメント

タイトルとURLをコピーしました