5

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

  command.exe 3*2

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

将“3 * 2”放在双引号之间没有帮助,仍然是同样的问题。

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

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

4

3 回答 3

6

在 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 替换为当前目录中的文件/目录列表。

因此,如果您的可执行文件通过扩展通配符来处理通配符,那么您无能为力。具体行为取决于您的命令。

如果您提供有关您的命令以及您想要实现的更多详细信息,我们可能会提供更多帮助。

于 2010-03-03T21:13:23.940 回答
1

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:\>
于 2010-03-03T21:13:53.100 回答
1

你可以尝试逃跑

command.exe 3^*2
于 2010-03-04T00:13:36.033 回答