如何用C++执行极端长命令? 我试图在C++程序中执行长参数的外部命令卷曲。

如何用C++执行极端长命令? 我试图在C++程序中执行长参数的外部命令卷曲。,c++,windows,cmd,cygwin,C++,Windows,Cmd,Cygwin,在Linux上运行良好,但Cygwin下的Windows总是显示,若cmd超过127个字符,系统将无法执行指定的程序 Linux接受几乎无限大小的相同代码。 尝试更改缓冲区的大小,没有更改 使用此代码: #include <string> #include <iostream> #include <stdio.h> std::string exec(char* cmd) { FILE* pipe = _popen(cmd, "r"); if

在Linux上运行良好,但Cygwin下的Windows总是显示,若cmd超过127个字符,系统将无法执行指定的程序

Linux接受几乎无限大小的相同代码。 尝试更改缓冲区的大小,没有更改

使用此代码:

#include <string>
#include <iostream>
#include <stdio.h>

std::string exec(char* cmd) {
    FILE* pipe = _popen(cmd, "r");
    if (!pipe) 
        return "ERROR";

    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    _pclose(pipe);
    return result;
}
这是Windows特有的限制,还是可能以某种方式扩展cmd缓冲区

添加了如何创建我尝试发送的字符*:

   string message="This is message to send.";
   std::string send="";
   std::string curl_header="curl -s -F \"token=aE71iieVt8G1RWdJb59qmAa3hbxxxx\" -F \"user=uPKYQyNgGURbH1g56nBnjn9jNsxxxxx\" -F \"message=";
   send.append(curl_header);
   send.append(message);
   send.append("\" https://api.pushover.net/1/messages.json");
   cout << "\n";
   cout << "FULL STRING WITH PARAMS TO EXECUTE:";
   std::cout << send << '\n';
   char *cstr = new char[send.length() + 1];
   strcpy(cstr, send.c_str());
   cout << "FULL CHAR ARRAY WITH PARAMS TO EXECUTE:";
   std::cout << cstr << '\n';//this returns correct string, even longer than 127 chars
   cout << exec(cstr);// this returns error, same with system() if cstr is longer than 127 chars
    delete [] cstr;

你试过使用这个系统吗

#include <iostream>

using namespace std;

int main(int argc,char** args){

if(argc<2){
    system("run run run run run run run run run run runr urn runrunrunru unr unrunr urn run runr unr urn run runrun runr unr urnrun runr urnurnrunrunrunrunrunrurn urnurnunrunrunrunrunrunrn u unru ru runr ur urn ru run rururnunrunrunr");
}else{
    printf("argc: %d",argc);
}
system("pause");
}

这对我来说似乎很管用。程序名为run,因此它使用这个巨大的参数运行自己,然后打印出它看到的参数数量。这就是您要做的吗?

我不确定,您能否将代码中的缓冲区大小更改为更大,然后尝试运行它。我建议您在调用失败后打印使用strerror的值。将设置errno。不确定我是否理解正确,但在添加行strerrorerno后,程序不会返回任何错误语句。我猜,popen并没有失败,添加了一些cout's around代码,并发现如果缓冲区设置为256,则while循环运行一个,但没有向结果添加任何字符@user3130843-更改缓冲区变量不会更改任何内容-exec仍然只接受127个字符。请尝试使命令的第一部分echo curl,以便查看Windows实际看到的命令行。如果问题不明显,请尝试手动运行该命令行,看看它是否有效。@HarryJohnston我尝试过,但运气不佳。首先认为一些斜杠/反斜杠有问题。所以我使用了cout-Well,它在我的例子中和exec一样有效——如果直接将cmd字符串写入系统中,效果很好。但是我正在执行动态创建的char*,这已经不起作用了。My char*是由一个存储在字符串中的追加函数创建的,并最终转换为char*。但在创建char*的最后,只要它是传递给系统的单个char*,它就应该工作吗?您是否尝试将数据流传输到应用程序?如果是,请使用标准输入和标准输出流。就参数/管道而言,这只意味着使用固定参数运行一次。否。我使用Pushover API从本地数据文件在线发送消息。下面是我创建并发送消息的代码:std::string curl_header=curl-s-F\token=aE71iieVt8G1RWdJb59qmAa3hbxxxx \-F\user=uPKYQyNgGURbH1g56nBnjn9jNsxxxxx \-F\message=;send.appendcurl_hlavicka;发送.appendmessage;发送。附加\;库特