我正在寻找一种方法,通过命令行将包含“*”字符的字符串传递给可执行文件。
command.exe 3*2
我想传递字符串3 * 2。相反,Windows会在当前目录中搜索与文件掩码“3 * 2”匹配的文件,并将找到的所有文件传递给command.exe
在双引号之间加上“3 * 2”无济于事,仍然是同样的问题。
我也尝试了'3 * 2'(在单引号之间),但随后传递了整个字符串(包括单引号),这不是我需要的。
有没有办法将字符串3 * 2(没有任何引号)传递给命令?
答案 0 :(得分:6)
在Windows命令shell中,您执行的命令负责扩展参数中存在的任何通配符。这种行为与Unix和朋友不同,其中通配符扩展通常由shell完成。
一个简单的例子证明了这一点。
Windows(Windows 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替换为当前目录中的文件/目录列表。
因此,如果您的可执行文件通过扩展它们来处理通配符,那么您无法做到这一点。具体行为取决于你的命令。
如果您提供有关命令的更多详细信息以及您希望实现的目标,我们可能会提供更多帮助。
答案 1 :(得分:1)
你可以尝试逃避
command.exe 3^*2
答案 2 :(得分:0)
Windows实际上将整个原始命令行作为单个字符串传递给程序;见GetCommandLine。编写main(int argc, char **argv)
时,程序与之链接的C运行时库负责将命令行拆分为argv
中的单词。
所以我们需要更多信息:你的shell是什么,你如何调用命令,以及你使用的是什么C运行时库?您所看到的问题绝对不是Windows本身,我无法使用cmd.exe和MSVC的CRT在此处重现它。
C:>type CON > test.c #include <stdio.h> int main(int argc, char **argv) { int i; printf("%d\n", argc); for (i = 0; i < argc; i++) printf("[%d] <%s>\n", i, argv[i]); return 0; } ^Z C:\>cl test.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj C:\>test.exe * 2 [0] <test.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] <*> $
只有当我尝试混合它们时 - 使用cmg.exe中的Cygwin CRT运行程序 - 我可能会看到你的问题
$ exit C:\>a.exe * 19 [0] <a> [1] <AUTOEXEC.BAT> [2] <BOOT.INI> [3] <CONFIG.SYS> [4] <Documents and Settings> [5] <IO.SYS> [6] <MSDOS.SYS> [7] <NTDETECT.COM> [8] <NTLDR> [9] <Program Files> [10] <RECYCLER> [11] <Recycled> [12] <System Volume Information> [13] <WINDOWS> [14] <cygwin> [15] <hiberfil.sys> [16] <pagefile.sys> [17] <temp> [18] <a.exe> C:\>
但我没有看到双引号的问题。
C:\>a.exe "*" 2 [0] <test.exe> [1] <*> C:\>