C++如何:利用_popen重定向cmd.exe

ConnorWang2012 2014-02-07 03:06:47
大家好,怎么在win32 console中利用_popen重定向cmd.exe?

尝试下面的代码,重定向cmd后,通过写pPipe输入命令,但没有成功新建2014这个目录,
明明pPipe!=null,但console窗口出现"过程写入的管道不存在"的错误信息


char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "cmd", "wt" )) == NULL )
{
printf( "open the pipe failed.\n");
}
else
{
printf( "open the pipe success.\n");
char string[] = "md E:\\2014";
int numWritten = fwrite(string,sizeof(char),strlen(string),pPipe);

printf( "Wrote %d char\n", numWritten );
}

if(pPipe != NULL)
_pclose( pPipe );
...全文
625 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gym345600 2014-06-14
  • 打赏
  • 举报
回复
重定向是个大学问,得好好深入研究一下
ConnorWang2012 2014-02-08
  • 打赏
  • 举报
回复
引用 1 楼 Bokutake 的回复:
我试了一下,你的程序基本没问题。不过输入的命令少一个\n。 md E:\\2014\n 这样才能使命令执行,否则cmd根本不会执行命令,就被_pclose结束了。 在Windows下,_popen()不推荐用,因为它只是用于console程序,对于GUI程序可能导致失去响应。 只是简单执行程序用system()就可以了。 创建目录使用CreateDirectory()、SHCreateDirectory()或者mkdir()不行么? 如果确实要重定向执行一些命令,建议用CreateProcess(),而且StdIn和StdOut都要重定向。 http://msdn.microsoft.com/zh-cn/library/ms682499.aspx
hi,Bokutake,谢谢你的回复,正像你说的一样,在命令后加了\n就可以正常执行了。 昨天整了一下午没整出来,谢谢! 现在有一个需求,需要在WinPE下对diskpart进行封装,但system("diskpart")被执行了后,再用 system("sel disk 0")执行sel disk 0命令时,console就没响应了,原因是system("diskpart") 被执行后,diskpart.exe重定向了console的StdIn和StdOut,system()是对console输入,所以 console就没法响应了。 于是我想用_popen对diskpart.exe重定向,才做了上面的实验。 之前也尝试你说的CreateProcess(),但又遇到一个问题,我依照 http://msdn.microsoft.com/en-us/library/ms682499.aspx 介绍的方法,想直接在buff里存命令,而不是通过file,也就是把

for (;;) 
   { 
      bSuccess = ReadFile(g_hInputFile, chBuf, BUFSIZE, &dwRead, NULL);
      if ( ! bSuccess || dwRead == 0 ) break;      
      bSuccess = WriteFile(g_hChildStd_IN_Wr, chBuf, dwRead, &dwWritten, NULL);
      if ( ! bSuccess ) break; 
   } 
改为

 { 
      //bSuccess = ReadFile(g_hInputFile, chBuf, BUFSIZE, &dwRead, NULL);
      //if ( ! bSuccess || dwRead == 0 ) break; 
      CHAR chBuf[BUFSIZE] = "md E:\\2014";
      bSuccess = WriteFile(g_hChildStd_IN_Wr, chBuf, strlen(chBuf), &dwWritten, NULL);
      //bSuccess = WriteFile(g_hChildStd_IN_Wr, chBuf, dwRead, &dwWritten, NULL);
      //if ( ! bSuccess ) break; 
   }
也是没有生成2014这个目录,原来也是少加了\n,但把md E:\\2014写在file中就可以正常生成2014 这个目录,原因是在file中每行行末自动添加了\n吧? Bokutake,谢谢你。
辰岡墨竹 2014-02-07
  • 打赏
  • 举报
回复
我试了一下,你的程序基本没问题。不过输入的命令少一个\n。 md E:\\2014\n 这样才能使命令执行,否则cmd根本不会执行命令,就被_pclose结束了。 在Windows下,_popen()不推荐用,因为它只是用于console程序,对于GUI程序可能导致失去响应。 只是简单执行程序用system()就可以了。 创建目录使用CreateDirectory()、SHCreateDirectory()或者mkdir()不行么? 如果确实要重定向执行一些命令,建议用CreateProcess(),而且StdIn和StdOut都要重定向。 http://msdn.microsoft.com/zh-cn/library/ms682499.aspx

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧