gpt4 book ai didi

c++ - 如何在C或C++中包装参数并将其传递给system或exec *

转载 作者:行者123 更新时间:2023-12-02 10:32:29 25 4
gpt4 key购买 nike

我想写一个包装器,用argv做一些简单的事情并调用一些脚本。我有以下要求:

  • 包装器必须是.exe文件
  • 包装程序必须能够处理空格并正确报价
  • 包装器将在用户端生成
  • 生成过程必须很小(例如使用https://bellard.org/tcc)

  • 我最初的方法:

    编写一个c程序来首先清除参数,然后将其包装在引号中,然后调用 system
    不幸的是,我无法从 systemexec*函数获得结构良好的行为。
    我希望以下所有示例输出类似 arg1=1; arg2=2; arg3=3; arg4=的内容(在引号中有一些差异),但是在某些示例中它会出错,并在execl处暂停:

    输入文件:
    @:: test.bat
    @echo off

    echo arg1=%1; arg2=%2; arg3=%3; arg4=%4
    //minimal-example.c
    #include <Windows.h>
    #include <stdio.h>

    int main( int argc, char ** argv ) {
    puts("\nExample 1:");
    system("\"test.bat\" \"1\" \"2\" \"3\" ");

    puts("\nExample 2:");
    system("test.bat \"1\" \"2\" \"3\" ");

    puts("\nExample 3:");
    system("test.bat 1 2 \"3\" ");

    puts("\nExample 4:");
    system("\"test.bat\" 1 \"2\" 3 ");

    puts("\nExample 5:");
    system("\"test.bat\" 1 2 3 ");

    puts("\nExample 6:");
    execl(argv[0], "test.bat", "1", "2", "3", NULL);

    return 0;
    }

    输出运行:
    Example 1:
    'test.bat" "1" "2" "3' is not recognized as an internal or external command,
    operable program or batch file.

    Example 2:
    arg1="1"; arg2="2"; arg3="3"; arg4=

    Example 3:
    arg1=1; arg2=2; arg3="3"; arg4=

    Example 4:
    'test.bat" 1 "2' is not recognized as an internal or external command,
    operable program or batch file.

    Example 5:
    arg1=1; arg2=2; arg3=3; arg4=

    Example 6:
    arg1=1; arg2=2; arg3=3; arg4=

    (示例6暂停,直到我按 Enter为止)

    题:
  • 有没有一种方法可以正确包装路径/参数,以便在system中允许空格?
  • 我可以在system的参数中转义引号吗?
  • 是否有运行exec*的非阻塞方式?
  • exec*方法是否可以确保包装程序的stdin stdout和stderr行为正确(没有奇怪的溢出或奇怪的阻塞现象?)
  • 最佳答案

    这样的事情应该起作用:

     string cmd = "test.bat";

    for(int i = 1; i < argc; i++) {
    cmd += " ";
    cmd += argv[i]
    }

    system(cmd.c_str());

    当然,其中包含空格的args需要通过添加引号来进一步处理,带有引号的参数可能需要转义,并且在args包含无法直接处理的情况下,还需要进行许多其他复杂处理)

    另外,您可以看看 Use CreateProcess to Run a Batch File

    关于c++ - 如何在C或C++中包装参数并将其传递给system或exec *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61726834/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com