从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
然而,创建过程仍然返回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改变了?
答案 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上提出更多相关问题