我正在寻找一种通过命令行将包含“*”字符的字符串传递给可执行文件的方法。
command.exe 3*2
我想传递字符串 3*2。Windows 所做的是在当前目录中搜索与文件掩码“3*2”匹配的文件,并将找到的任何文件传递给 command.exe
将“3 * 2”放在双引号之间没有帮助,仍然是同样的问题。
我也尝试了 '3*2' (在单引号之间),但是整个字符串(包括单引号)都被传递了,这不是我需要的。
有没有办法将字符串 3*2 (不带任何引号)传递给命令?
我正在寻找一种通过命令行将包含“*”字符的字符串传递给可执行文件的方法。
command.exe 3*2
我想传递字符串 3*2。Windows 所做的是在当前目录中搜索与文件掩码“3*2”匹配的文件,并将找到的任何文件传递给 command.exe
将“3 * 2”放在双引号之间没有帮助,仍然是同样的问题。
我也尝试了 '3*2' (在单引号之间),但是整个字符串(包括单引号)都被传递了,这不是我需要的。
有没有办法将字符串 3*2 (不带任何引号)传递给命令?
在 Windows 命令 shell 中,您执行的命令负责扩展参数中存在的任何通配符。这种行为与 Unix 和朋友不同,通配符扩展通常由 shell 完成。
一个简单的例子说明了这一点。
视窗(视窗 7):
C:\Users\Frank>echo *
*
如您所见,该命令输出的参数与命令行传入的参数完全相同。
Linux(CentOS Linux 5 上的 bash):
> echo *
centos-release-5-0.0.el5.centos.2.i386.rpm centos-release-notes-5.0.0-2.i386.rpm glibc-2.5-12.i386.rpm glibc-common-2.5-12.i386.rpm virtualmin-install.log
这里通配符参数被 shell 替换为当前目录中的文件/目录列表。
因此,如果您的可执行文件通过扩展通配符来处理通配符,那么您无能为力。具体行为取决于您的命令。
如果您提供有关您的命令以及您想要实现的更多详细信息,我们可能会提供更多帮助。
Windows 实际上将整个原始命令行作为单个字符串传递给程序;请参阅GetCommandLine。编写main(int argc, char **argv)
时,程序链接的 C 运行时库负责将命令行拆分为argv
.
所以我们需要更多信息:你的 shell 是什么,你是如何调用你的命令的,你使用的是什么 C 运行时库?您看到的问题绝对不是 Windows 本身,我无法在此处使用 cmd.exe 和 MSVC 的 CRT 重现它。
C:>输入CON> test.c #include <stdio.h> int main(int argc, char **argv) { 诠释我; printf("%d\n", argc); 对于 (i = 0; i < argc; i++) printf("[%d] <%s>\n", i, argv[i]); 返回0; } ^Z C:\>cl 测试.c Microsoft (R) 32 位 C/C++ 优化编译器版本 15.00.30729.01 用于 80x86 版权所有 (C) 微软公司。版权所有。 测试.c Microsoft (R) 增量链接器版本 9.00.30729.01 版权所有 (C) 微软公司。版权所有。 /out:test.exe 测试.obj C:\>test.exe * 2 [0] <测试.exe> [1] <*> C:\>
如果我使用 Cygwin 的 CRT,并从 Cygwin 的 Bash shell 运行,那么我也看不到问题。
C:\>C:\cygwin\bin\bash -l $ cd /cygdrive/c $ cc test.c $ ./a.exe '*' 2 [0] </a> [1] <*> $
只有当我尝试混合它们时——使用 cmd.exe 中的 Cygwin 的 CRT 运行程序——我可能会看到你的问题
$退出 C:\>a.exe * 19 [0] <一> [1] <自动执行.BAT> [2] <启动.INI> [3] <CONFIG.SYS> [4] <文档和设置> [5] <IO.SYS> [6] <MSDOS.SYS> [7] <NTDETECT.COM> [8] <NTLDR> [9] <程序文件> [10] <回收站> [11] <回收> [12] <系统卷信息> [13] <窗口> [14] <赛格温> [15] <hiberfil.sys> [16] <页面文件.sys> [17] <温度> [18] <a.exe> C:\>
但我认为双引号没有问题。
C:\>a.exe "*" 2 [0] <测试.exe> [1] <*> C:\>
你可以尝试逃跑
command.exe 3^*2