【问题标题】:C#: Not fully expanding environment variables?C#:没有完全扩展环境变量?
【发布时间】:2016-02-12 04:36:21
【问题描述】:

如果你进入控制面板>环境变量并查看你的PATH,会有如下部分:

...Toolkit\;%USERPROFILE%\.dnx\bin;C:\Program...

换句话说,其他环境变量“嵌入”在PATH 中。

现在我的问题。当我从我的 C# 应用程序中调用 Environment.GetEnvironmentVariable("PATH") 时,它会自动扩展 PATH 中的变量,因此该段将如下所示:

...Toolkit\;C:\Users\James\.dnx\bin;C:\Program...

当我的程序修改PATH 并通过Environment.SetEnvironmentVariable("PATH", ...) 将其保存回来时,子变量被删除 并且%USERPROFILE% 被替换为C:\Users\James。

如何防止这种情况发生?

【问题讨论】:

    标签: c# .net windows path environment-variables


    【解决方案1】:

    PATH 变量内部不应包含环境变量,因为它是 REG_SZ 注册表值,而不是可扩展的 REG_EXPAND_SZ 值。

    解决方法是不要在 PATH 值中添加变量,也不要使用Environment.ExpandEnvironmentVariables 作为 PATH 变量。

    无论如何我都会回答你的问题。

    如何防止这种情况发生?

    只需将“%”字符替换为不可扩展的符号或添加另一个符号,如“_”字符,这样您就可以确保变量不会被扩展。

    string value =
        Environment.ExpandEnvironmentVariables(
                    Environment.GetEnvironmentVariable("Path").Replace("%", "%_"));
    

    【讨论】:

    • 他们抱怨 GetEnvironmentVariable 已经执行了扩展。
    • @Joey 是的,差不多。
    • 我不太确定这个答案,因为当我第一次拿到电脑并查看PATH 时,它已经嵌入了一些变量,例如%SystemRoot%\System32。不过我会接受的。
    • 没关系,找到更好的解决方案,我很快就会发布。
    • 对不起所有的 cmets,但我只是查看了 regedit 和 PATH is 一个 REG_EXPAND_SZ 值,所以这个答案是错误的......
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多