【问题标题】:C# set environment variableC#设置环境变量
【发布时间】:2012-04-04 04:27:14
【问题描述】:

我在使用 C# 设置环境变量时遇到问题。

在某些情况下我需要修改一些环境变量。例如我需要修改 NDSRC 变量。

我用:

Environment.SetEnvironmentVariable("MY_VARIABLE", "value", EnvironmentVariableTarget.Machine);

这很好用。

接下来我运行一些使用该变量的脚本。现在有一个问题,因为脚本看不到变量。

示例: 使用

设置路径变量(在末尾添加目录)
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine) + ";c:\\";
Environment.SetEnvironmentVariable("Path", path, EnvironmentVariableTarget.Machine);

打开windows命令行(开始->运行->cmd.exe)。

在命令行输入 cmd

系统找不到cmd.exe:'cmd'不是内部或外部命令、可运行程序或批处理文件。

如果您检查 Windows 设置 -> 环境变量,则路径已正确设置为新值。如果您签入打开的命令提示符,它也会被设置。

【问题讨论】:

    标签: c# environment-variables


    【解决方案1】:

    很遗憾,您需要重新启动进程才能刷新环境变量。看到这个MSDN post

    【讨论】:

    • 你好。那不是问题。我使用 Environment.SetEnvironmentVariable("MY_VARIABLE", "value", EnvironmentVariableTarget.Process);为我的流程设置环境变量,它可以工作。问题是在我的进程之外,即使我看到更改的变量,任何其他进程似乎都看不到它。在示例中,我只是向 Path 变量添加了一些内容。之后,系统根本看不到路径变量。
    【解决方案2】:

    进程启动时变量被继承,之后保持不变。

    但是,您没有理由不能定期读取相关注册表项并从中手动更新进程的环境变量。事实上,如果您追求的是最新值,则这里是 the right thing to do

    基本上,注册表会为环境变量存储一个模板,这就是您通过“Windows 设置 -> 环境变量”编辑的内容。当您这样做时,Windows 会向所有相关方广播一条消息。然后,任何此类方都可以从注册表中重新创建环境变量的副本。

    我不知道有任何现成的函数可以调用来执行此重新创建,但是,您可能必须编写自己的函数。

    【讨论】:

    • 使用Environment.SetEnvironmentVariable设置环境变量有问题
    • 我找到了解决方法:从代码创建进程 (cmd.exe)。在此过程中执行“setx /M 变量值”命令。这将修改全局环境变量,不会导致问题。
    • @user641426:全局anything随着时间的推移往往会导致问题。
    • 对我来说,“setx /M”由于 256 个字符的限制而失败(我的路径变量太长)。
    • 如果你杀死并重新启动所有 explorer.exe 进程,那么 explorer/start-menu/start-run 产生的任何东西(大多数东西)都将获得新的 PATH。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2018-07-13
    • 2014-12-17
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多