gpt4 book ai didi

c - COMSPEC 和 PATH 环境变量应该是什么来定位命令解释器,使用 system()?

转载 作者:可可西里 更新时间:2023-11-01 11:14:57 25 4
gpt4 key购买 nike

操作系统 (XP) 环境变量是否与从 visual studio .NET C++ 运行的进程中使用的相同?

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

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

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 ));

}

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

然而,创建过程仍然返回 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
不确定有什么区别...?
现在设置了这个环境变量,浏览器对 cgi 应用程序的任何请求都会提供保存 cgi.exe 而不是执行它的选项。不确定为什么会根据这个环境变量改变它?

最佳答案

环境变量在运行进程时被继承,包括system(...)调用。除非有什么奇怪的事情发生,通常运行 %windir%\system32\cmd.exe 应该可以解决问题,它应该扩展环境变量,除非你可以使用 API 来获取 windows 目录' GetWindowsDirectory '.有关 MSDN 中的示例,请参见此处.

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

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

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

我还应该指出,您是临时设置环境变量,因此它不会看到“COMSPEC”....它不是永久性的,唯一永久性的方法是按照屏幕截图...

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

alt text

alt text

编辑#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...

编辑#3:糟糕,我注意到当我使用“&pi”时,它变成了一个 pi 符号!...呃,现在已经修改了...我也修改了这个“argv”代码在这里:

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

关于c - COMSPEC 和 PATH 环境变量应该是什么来定位命令解释器,使用 system()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com