【问题标题】:How to safely append to ProcessStartInfo.EnvironmentVariables["PATH"]如何安全地附加到 ProcessStartInfo.EnvironmentVariables["PATH"]
【发布时间】:2019-12-13 04:41:32
【问题描述】:

我目前正在将 C# 应用程序从 .NET Framework 移植到 .NET Core,以便能够在 Linux 上运行它。在某些时候,此应用程序使用System.Diagnostics.Process 类在单独的进程中启动另一个程序。虽然这通常运行良好,但该特定程序需要使用修改后的 PATH 环境变量运行。这就是我为 Windows 所做的(更改了在 Linux 上测试的路径):

string directory = "/tmp";
ProcessStartInfo processStartInfo = new ProcessStartInfo
{
    Arguments = "-c \"echo $PATH\"",
    FileName = "/bin/bash",
};
processStartInfo.EnvironmentVariables["PATH"] += ";" + directory;
Process.Start(processStartInfo);

不幸的是Linux使用冒号(“:”)作为路径分隔符,因此程序产生

/usr/local/bin:/usr/bin:/bin:/usr/games;/tmp

而不是期望的输出

/usr/local/bin:/usr/bin:/bin:/usr/games:/tmp

我现在的问题是:如何以安全、跨平台的方式正确更新 PATH 变量?是否有一些依赖于系统的属性来检索分隔符(例如 Environment.NewLine 用于换行符或 Path.DirectorySeparatorChar 用于斜杠),还是我必须手动检查当前操作系统?

【问题讨论】:

    标签: c# .net-core process environment-variables


    【解决方案1】:

    只需检查您是否在 linux 上运行。如果是这样,请使用“:”而不是“;”。

    int platform = (int) Environment.OSVersion.Platform;
    bool isLinux = (platform == 4) || (platform == 6) || (platform == 128);
    
    string directory = "/tmp";
    ProcessStartInfo processStartInfo = new ProcessStartInfo
    {
        Arguments = "-c \"echo $PATH\"",
        FileName = "/bin/bash",
    };
    processStartInfo.EnvironmentVariables["PATH"] += (isLinux ? ":" : ";") + directory;
    Process.Start(processStartInfo);
    

    参考: Detect Linux

    【讨论】:

      【解决方案2】:

      This 应该是你需要的:

      processStartInfo.EnvironmentVariables["PATH"] += Path.PathSeparator + directory;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 2011-01-24
        • 2016-01-12
        • 2011-02-13
        • 2016-03-01
        • 1970-01-01
        相关资源
        最近更新 更多