我的application接受一个字符串命令并在某个过程中重复执行它,每次都有不同的环境变量。为了支持任何类型的命令,我使用指定的命令运行cmd /C
,系统负责解析和运行命令。但是,我想通过在这些系统上调用sh -c
来使应用程序与Unix .NET实现兼容。
所以,我想以最便携的方式确定两件事 - 应该执行的正确解释器(在Windows上cmd
,sh
或者在Unix上可能是用户指定的)以及它接受的变量(Windows上为%var%
,Unix上为$var
。)
目前,我考虑检查COMSPEC
环境变量,如果它指向Windows风格的命令行解释器并使用它,或者查找SHELL
变量并使用它。是否有更好的管理替代方案,或者这是否足够?
答案 0 :(得分:0)
我可能在这里误解了一些内容,但为什么不使用System.Environment.OSVersion.Platform
?
答案 1 :(得分:0)
我已经决定检查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
的解释器。将命令传递给解释器的工作方式之间也存在差异,SHELL
期望命令作为一个(正确转义)参数,而COMSPEC
只需将命令包装在其他引号中即可。