在Linux中,使用exec*命令将命令行参数传递给应用程序非常简单,您只需明确地传递每个参数即可。但是,在Windows上使用相同的函数进行此操作并不可取,如果想要控制标准管道的话。由于这些函数基于CreateProcess(),因此需要遵循一些明确的规则来转义特殊字符(如双引号)。
不幸的是,只有当被调用的应用程序通过main()、wmain()或CommandLineToArgvW()获取其命令行参数时,才能正确地工作。然而,如果被调用的应用程序通过WinMain()、wWinMain()、GetCommandLineA()或GetCommandLineW()获取这些参数,则由应用程序解析命令行参数的方式取决于它获得整个命令行而不是逐个参数。
这意味着一个名为test的简单应用程序,使用main()作为入口点,如果被称为
这就引出了我的问题:
尽管存在这些怪癖,如何以通用的方式传递命令行参数给Windows应用程序?
不幸的是,只有当被调用的应用程序通过main()、wmain()或CommandLineToArgvW()获取其命令行参数时,才能正确地工作。然而,如果被调用的应用程序通过WinMain()、wWinMain()、GetCommandLineA()或GetCommandLineW()获取这些参数,则由应用程序解析命令行参数的方式取决于它获得整个命令行而不是逐个参数。
这意味着一个名为test的简单应用程序,使用main()作为入口点,如果被称为
test.exe \"abc\"
,则会得到"abc"。如果将cmd.exe称为cmd.exe /c "echo \"abc\""
,则不会像预期的那样输出"abc",而是\"abc\"。这就引出了我的问题:
尽管存在这些怪癖,如何以通用的方式传递命令行参数给Windows应用程序?
CommandLineToArgvW
有些不同。无论如何,API级别没有这些规则。在Windows中,引用的常见约定除了基本的双引号字符外,没有其他。当你将文件拖到可执行文件上时,常见的GUI shell只是引用它们(你可以尝试一下,看看如何传递它们)。 - Cheers and hth. - Alfabc\"xyz
传递给任何应用程序,并保留所有字符完全按照给定的方式。 - user2525536