COMSPEC和PATH环境变量应该使用system()来定位命令解释器?

时间:2010-02-16 21:27:38

标签: c windows visual-studio winapi command-line

从Visual Studio .NET C ++运行的进程中,OS(XP)环境变量是否相同?

似乎找不到命令解释器:
使用NULL作为命令时system() returns 0和命令 - ENOENT Command interpreter cannot be found

在Windows(系统 - >环境变量)中,COMSPEC包含cmd.exe的路径 PATH没有。

PATH应该是什么?

除此之外,不确定为什么找不到翻译。

任何建议都表示赞赏。感谢。

  if( system("tail -500 log.txt") == -1)
  {
      //Error calling tail.exe on log 
      //errno is a system macro that expands int returning
      //the last error. strerror() converts the error to it's
      //corresponding error message. 
      printf("Error calling tail.exe with system(): %s",strerror( errno ));

  }

EDIT1
步入system()argv[0] = _tgetenv(_T("COMSPEC"));会返回一个错误的指针。由于这是一个cgi可执行文件,COMPSEC未正确设置或继承自操作系统 我现在在进程启动之前设置COMSPEC,并使用example 2

中的CreateProcess()

然而,创建过程仍然返回0?越来越近。看到这个有什么问题吗?感谢。

 if (! SetEnvironmentVariable("COMSPEC", "C:\\WINDOWS\\system32\\cmd.exe") )
 {
    printf("SetEnvironmentVariable failed (%d)\n", GetLastError());         
 }

 //r = system("dir c:\\");
 r = CreateProcess("dir.exe", NULL, NULL, NULL, TRUE, NULL, 
    NULL,     // inherit parent's environment 
    NULL, &si, &pi);

编辑2
SetEnvironmentVariable()不起作用。然而,putenv确实    _putenv( "COMSPEC=C:\\WINDOWS\\system32\\cmd.exe" ); // C4996
不确定有什么不同......? 现在已经设置了这个env var,来自浏览器的cgi app上的任何请求都提供了保存cgi.exe而不是执行它的选项。不知道为什么这个基于这个env var改变了?

2 个答案:

答案 0 :(得分:3)

运行流程时会继承环境变量,包括system(...)调用。除非有一些奇怪的事情发生,通常运行%windir%\ system32 \ cmd.exe应该可以做到这一点,它应该扩展环境变量,除非你可以使用API​​来获取windows目录“GetWindowsDirectory”。请参阅此处以获取MSDN

中的示例

编辑: IIRC,COMSPEC环境变量,如果在命令行上完成

> echo %COMSPEC%
C:\WINDOWS\system32\cmd.exe

你有一个坏指针,因为它可能没有设置,上面的echo命令应该证明,如果你没有输出,它没有设置,右击“我的电脑”,左键单击'属性',出现带有标签页的对话框,点击'高级',查找'环境变量'...查看此处的两个屏幕截图...

另外我应该指出你是暂时设置环境变量,因此它不会看到'COMSPEC'....它不是永久性的,唯一永久的方法是按照屏幕截图... < / p>

我正在尝试截取屏幕截图....

alt text http://img706.imageshack.us/img706/9434/envvars.png

alt text http://img638.imageshack.us/img638/5743/comspec.png

修改#2: 只是要指出这一点,当你在这里设置环境变量时,这是暂时的 - 不是永久性的!

if (! SetEnvironmentVariable("COMSPEC", "C:\\WINDOWS\\system32\\cmd.exe") )
 {
    printf("SetEnvironmentVariable failed (%d)\n", GetLastError());         
 }

 //r = system("dir c:\\");
 r = CreateProcess("dir.exe", NULL, NULL, NULL, TRUE, NULL, 
    NULL,     // inherit parent's environment 
    NULL, &si, &pi);

当使用调用CreateProcess时,它必然会失败,请查看注释“继承父级环境”,这不会因为临时设置环境而发生。你在这里测试了简单的echo命令吗?关于为什么没有设置COMSPEC变量有什么问题。在永久设置它之后 - 你需要重启机器才能工作。然后上面的echo命令应该显示该环境变量的值,反过来,这个

argv[0] = strdup(_tgetenv(_T("COMSPEC")));

应该返回一个正确的指针......顺便说一下,我认为那应该是strdup'd ...

编辑#3 :当我使用'&amp; pi'时我发现了哎呀,它反而变成了symbol符号!...呃,现在已经修改了......我也有在这里修改了这个'argv'代码:

argv[0] = _tcsdup(_tgetenv(_T("COMSPEC")));

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:2)

启动+控制面板,系统,高级,环境变量。在“系统变量”部分的“编辑”中选择“路径它至少应该是这样的:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

在superuser.com上提出更多相关问题