在Windows Shell中将包含*(星号)字符的字符串作为命令行参数传递

时间:2010-03-03 20:11:49

标签: windows shell windows-shell

我正在寻找一种方法,通过命令行将包含“*”字符的字符串传递给可执行文件。

  command.exe 3*2

我想传递字符串3 * 2。相反,Windows会在当前目录中搜索与文件掩码“3 * 2”匹配的文件,并将找到的所有文件传递给command.exe

在双引号之间加上“3 * 2”无济于事,仍然是同样的问题。

我也尝试了'3 * 2'(在单引号之间),但随后传递了整个字符串(包括单引号),这不是我需要的。

有没有办法将字符串3 * 2(没有任何引号)传递给命令?

3 个答案:

答案 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:\>