使用c#在Windows中未设置环境。我哪里错了?

时间:2014-12-04 05:10:39

标签: c# windows winapi environment-variables

string path = System.Environment.GetEnvironmentVariable("Path");
Console.WriteLine(path);
if (!path.Contains("C:\ccstg"))
{
    if (!path.EndsWith(";"))
        path = path + ';';
    var v=@"C:\ccstg;";
    path = path + v;
    Environment.SetEnvironmentVariable("Path",path);
    Console.WriteLine(path);
    Console.WriteLine("Path Set");
    Console.ReadKey();
}

我正在尝试使用c#设置路径环境变量,我能够得到" Path"但设置它时没有设置。它也没有显示任何错误。我也尝试过以管理员身份运行它,没有帮助。

有人在这里找不到什么?

2 个答案:

答案 0 :(得分:5)

首先,您需要对字符串文字稍微小心,您发布的代码将无法编译,因为“\ c”不是有效的字符串文字转义序列。修复:

        string newPathComponent = @"C:\ccstg";
        if (!path.Contains(newPathComponent))
        {
            if (!path.EndsWith(";"))
                path = path + ';';
            path = path + newPathComponent;
            Environment.SetEnvironmentVariable("Path", path);

现在,此代码可以工作并设置进程持续时间的路径。如果要永久设置路径,则需要使用Environment.SetEnvironmentVariable Method (String, String, EnvironmentVariableTarget),例如:

            var target = EnvironmentVariableTarget.User; // Or EnvironmentVariableTarget.Machine
            Environment.SetEnvironmentVariable("Path", path, target);

更多here

但是,如果这样做,则必须小心地将路径组件仅添加到与EnvironmentVariableTarget关联的路径中。那是因为%PATH%环境变量实际上是combined from several sources。如果您不小心,可以将组合路径复制到EnvironmentVariableTarget.MachineEnvironmentVariableTarget.User来源 - 您不想这样做。

因此:

    static void AddToEnvironmentPath(string pathComponent, EnvironmentVariableTarget target)
    {
        string targetPath = System.Environment.GetEnvironmentVariable("Path", target) ?? string.Empty;
        if (!string.IsNullOrEmpty(targetPath) && !targetPath.EndsWith(";"))
            targetPath = targetPath + ';';
        targetPath = targetPath + pathComponent;
        Environment.SetEnvironmentVariable("Path", targetPath, target);
    }

最后,如果您在Visual Studio Hosting Process内部进行调试,我发现如果您使用Environment.SetEnvironmentVariable("Path",path, EnvironmentVariableTarget.User),则在退出并重新启动visual studio之前,不会更改永久环境。我认为,与视觉工作室托管过程有些奇怪。要处理这种奇怪的情况,你可能想要同时做到这两点:

AddToEnvironmentPath(@"C:\ccstg", EnvironmentVariableTarget.User)
AddToEnvironmentPath(@"C:\ccstg", EnvironmentVariableTarget.Process)

答案 1 :(得分:1)

SetEnvironmentVariable设置当前进程的变量 。您的流程有自己的环境。在程序中设置环境变量时,它只会影响程序的环境。

如果您想影响用户的环境,即进行更改以便可以在程序外看到,那么您必须致电this overload。例如:

Environment.SetEnvironmentVariable("Path", path, EnvironmentVariableTarget.User);

有关详细信息,请参阅EnvironmentVariableTarget枚举。