获取命令行解释器

时间:2017-11-19 10:47:56

标签: c# .net windows shell unix

我的application接受一个字符串命令并在某个过程中重复执行它,每次都有不同的环境变量。为了支持任何类型的命令,我使用指定的命令运行cmd /C,系统负责解析和运行命令。但是,我想通过在这些系统上调用sh -c来使应用程序与Unix .NET实现兼容。

所以,我想以最便携的方式确定两件事 - 应该执行的正确解释器(在Windows上cmdsh或者在Unix上可能是用户指定的)以及它接受的变量(Windows上为%var%,Unix上为$var。)

目前,我考虑检查COMSPEC环境变量,如果它指向Windows风格的命令行解释器并使用它,或者查找SHELL变量并使用它。是否有更好的管理替代方案,或者这是否足够?

2 个答案:

答案 0 :(得分:0)

我可能在这里误解了一些内容,但为什么不使用System.Environment.OSVersion.Platform

答案 1 :(得分:0)

我已经决定检查SHELLCOMSPEC环境变量,以找到正确的解释器及其规范。

static void GetSystemShell(out bool comspec, out string fileName, out string arguments)
{
    fileName = Environment.GetEnvironmentVariable("COMSPEC");
    if(fileName != null)
    {
        comspec = true;
    }else{
        fileName = Environment.GetEnvironmentVariable("SHELL");
        if(fileName != null)
        {
            comspec = false;
        }else{
            fileName = "cmd";
            comspec = true;
        }
    }

    if(comspec)
    {
        arguments = "/C";
    }else{
        arguments = "-c";
    }
}

如果设置了两个变量,它更喜欢兼容COMSPEC的解释器。将命令传递给解释器的工作方式之间也存在差异,SHELL期望命令作为一个(正确转义)参数,而COMSPEC只需将命令包装在其他引号中即可。