使c ++程序以交互方式将输入输出传递给Windows命令提示符

Posted

技术标签:

【中文标题】使c ++程序以交互方式将输入输出传递给Windows命令提示符【英文标题】:Make c++ program to pass input output to windows command prommpt interactively 【发布时间】:2015-01-29 18:49:42 【问题描述】:

我想制作一个简单的程序,它并行启动 cmd.exe 并将用户输入作为命令,然后将其传递给 cmd.exe,执行后我的程序应该从 cmd.exe 获取输出并将其显示给用户。基本上是命令提示符的接口。

我不想使用像 system() 这样的方法,因为它们每次都会启动一个新的 cmd 实例,而我无法运行像 cd 这样的命令。

我使用以下代码进行了尝试,我可以使用它生成一个 cmd 并显示初始行(版权...),但传递命令只是再次返回同一行。

#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;

DWORD WINAPI exec(LPVOID inputP)

char* input=(char*) inputP;
HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr;
SECURITY_ATTRIBUTES sa = sizeof(SECURITY_ATTRIBUTES), NULL, true;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD stuff;
char buff[1000];


//Create the main transfer pipe
if(!CreatePipe(&stdinRd, &stdinWr, &sa, 0) || !CreatePipe(&stdoutRd,&stdoutWr, &sa, 0)) 
cout<<"Pipe creation failed"<<endl;


//Get Process Startup Info
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
si.hStdOutput = stdoutWr;
si.hStdError = stdoutWr;                                                                                               
si.hStdInput = stdinRd;

//Create the CMD Shell using the process startup info above

if(!CreateProcess("C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 
cout<<"Error Spawning Command Prompt."<<endl;



//Main while(1) Loop
while(1) 

Sleep(100);
//Check if cmd.exe has not stoped
GetExitCodeProcess(pi.hProcess, &stuff);
//Stop the while loop if not active
if(stuff != STILL_ACTIVE) break;

//Copy Data from buffer to pipe and vise versa
PeekNamedPipe(stdoutRd, NULL, 0, NULL, &stuff, NULL);

ZeroMemory(buff, sizeof(buff));

//Read Console Output
ReadFile(stdoutRd, buff, 1000, &stuff, NULL);
//output 
cout<<buff<<endl;


//Read data from stream and pipe it to cmd.exe
WriteFile(stdinWr, input, strlen(input), &stuff, NULL);



return 0;

int main() 
while(1)
char a[100];
cin>>a;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)exec, (LPVOID)a, 0, NULL);


【问题讨论】:

main 中的循环为用户输入的每个项目调用 exec()。这不是你想要的,是吗?这意味着您将不断获得新的 cmd.exe 实例 看起来第一个问题是您没有发送RETURN。命令解释器正在耐心等待您完成输入命令。 我曾尝试仅启动 cmd 一次(通过设置 if 条件仅运行一次)但我仍然只获得命令提示符的初始行(Microsoft Windows 版本....然后小路 ...)。你能告诉我是否有更好的方法吗?我检查了 cmd.exe 正在启动的任务管理器,但没有返回输入的命令的任何响应.. 【参考方案1】:

发现我的问题,很傻。只需传递一个换行符,以便 cmd 将数据解释为命令,即,

cin>>a;
strcat(a,"\n");

显然,只需调用一次线程并通过全局变量传递参数,就可以创建一个 cmd 实例。

【讨论】:

以上是关于使c ++程序以交互方式将输入输出传递给Windows命令提示符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 语言中将输入和检索输出传递给子进程

使用管道进行Python进程输入/输出

在 c 中将 char 作为参数传递

以编程方式将文本字段值传递给另一个视图中的标签

C语言画图模式下如何将当前坐标赋给一个变量?方面下面引用该坐标值。

shell 输入输出重定向