操作系统(XP)的环境variables是否在从Visual Studio .NET C ++运行的进程中使用?
看来命令解释器没有find:
当使用NULL作为命令时, system()返回0,并且使用命令ENOENT Command interpreter cannot be found
。
在Windows(System-> Environmental Variables)中,COMSPEC包含cmd.exe的path
PATH没有。
PATH应该是什么?
除此之外,不知道为什么找不到解释器。
任何build议表示赞赏。 谢谢。
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没有正确设置或从操作系统inheritance。
现在我在启动过程之前设置COMSPEC,并使用CreateProcess(),如例2所示
但是,创build进程仍然返回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应用程序的任何请求给出的选项来保存cgi.exe而不是执行它..不知道为什么这已经改变基于这个env var?
运行进程时会继承环境变量,包括system(...)
调用。 除非有什么奇怪的事情发生,否则通常运行%windir%\ system32 \ cmd.exe应该这样做,它应该扩展环境变量,除非您可以使用API来获取Windows目录“ GetWindowsDirectory ”。 在这里看到一个来自MSDN的例子。
编辑: IIRC,COMSPEC环境变量,如果在命令行上完成
> echo%COMSPEC% C:\ WINDOWS \ SYSTEM32 \ CMD.EXE
你有一个坏的指针,因为它可能没有设置,上面的回声命令应该证明,如果你没有输出,它没有设置,右键单击“我的电脑”,左键单击“属性”,一个出现标签页的对话框,点击“高级”,找到“环境变量”…看到这里的两个截图…
另外我应该指出,你是临时设置环境变量,因此它不会看到'COMSPEC'….它不是永久的,唯一的永久性的方法是按照屏幕截图…
我正在尝试获取截图…
替代文字http://img706.imageshack.us/img706/9434/envvars.png
替代文字http://img638.imageshack.us/img638/5743/comspec.png
编辑#2:只要指出这一点,当你在这里设置环境变量,这是暂时的 – 不是永久的!
如果(!SetEnvironmentVariable(“COMSPEC”,“C:\\ WINDOWS \\ system32 \\ cmd.exe”)) { printf(“SetEnvironmentVariable失败(%d)\ n”,GetLastError()); } // r = system(“dir c:\\”); r = CreateProcess(“dir.exe”,NULL,NULL,NULL,TRUE,NULL, NULL,//继承父级的环境 NULL,&si,&pi);
当使用调用CreateProcess
,它肯定会失败,查看注释“inherit parent's environment”,这是暂时无法建立的环境。 你在这里测试了简单的回声命令吗? 什么是错误的,为什么COMSPEC变量没有设置..永久设置后 – 你将需要重新启动机器的工作。 然后,上面的echo命令应该显示该环境变量的值,并依次显示该值
argv [0] = strdup(_tgetenv(_T(“COMSPEC”)));
应该返回一个适当的指针…顺便说一句,我认为这应该是'd也…
编辑#3 :我注意到,当我使用'&pi'的时候,它是作为一个pi符号代替的!呃,现在已经修改了…我也修改了这个'argv'代码:
argv [0] = _tcsdup(_tgetenv(_T(“COMSPEC”)));
希望这有助于,最好的问候,汤姆。
开始+控制面板,系统,高级,环境变量。 在系统变量部分中选择编辑。 至少应该是这样的:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
在superuser.com上询问更多的问题