繁体   English   中英

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

[英]Pass a string containing the * (asterisk) character as a command line argument in Windows Shell

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

  command.exe 3*2

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

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

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

是否可以将字符串3 * 2(不带引号)传递给命令?

在Windows命令外壳程序中,您执行的命令负责扩展参数中存在的所有通配符。 这种行为不同于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

此处,外壳程序将通配符参数替换为当前目录中的文件/目录列表。

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

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

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] <*>
$

只有当我尝试将它们混合在一起时-使用来自cmd.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:\>

你可以尝试转义

command.exe 3^*2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM