代码之家  ›  专栏  ›  技术社区  ›  IS4

获取命令行解释器

  •  1
  • IS4  · 技术社区  · 8 年前

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

    因此,我想以最便携的方式确定两件事——应该执行的正确的解释器( cmd 在Windows上, sh 或者可能是用户在Unix上指定的)及其接受的变量样式( %var% 在Windows上, $var 在Unix上)。

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

    2 回复  |  直到 8 年前
        1
  •  0
  •   InBetween    8 年前

    我可能在这里误解了什么,但为什么不使用呢 System.Environment.OSVersion.Platform ?

        2
  •  0
  •   IS4    8 年前

    SHELL COMSPEC 环境变量以找到正确的解释器及其规范。

    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公司 -如果两个变量都设置了,则为兼容的解释器。将命令传递给解释器的工作方式也存在差异, 外壳 期望命令作为一个(正确转义的)参数,而 COMSPEC公司 只需将命令用附加引号括起来,效果最佳。