2010-03-03 4 views
2

Я ищу способ передать строку, содержащую символ «*», в исполняемый файл через командную строку.Передайте строку, содержащую символ * (звездочка) в качестве аргумента командной строки в Windows Shell

command.exe 3*2 

Я хочу передать строку 3 * 2. Вместо этого Windows выполняет поиск в текущем каталоге для файлов, соответствующих файловой маске «3 * 2», и передает любые файлы, найденные в command.exe

Ввод «3 * 2» между двойными кавычками не помогает, та же проблема.

Я также пробовал '3 * 2' (между одинарными кавычками), но затем передается вся эта строка (включая одинарные кавычки), что не то, что мне нужно.

Есть ли способ передать строку 3 * 2 (без кавычек) команде?

ответ

6

В командных оболочках Windows команда, которую вы выполняете, отвечает за расширение любых подстановочных знаков, присутствующих в параметрах. Такое поведение отличается от Unix и друзей, где расширение подстановки обычно выполняется оболочкой.

Простой пример демонстрирует это.

для Windows (Windows 7):

C:\Users\Frank>echo * 
* 

Как вы можете видеть, команда выводит параметр точно так, как передается в командной строке.

Linux (Баш на CentOS Linux 5):

> 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 

Здесь дикий параметр карты заменяется оболочки в список файлов/каталогов в текущем каталоге.

Так что, если ваш исполняемый файл обрабатывает подстановочные знаки, расширяя их, вы не можете с этим поделать. Конкретное поведение зависит от вашей команды.

Если вы предоставите более подробную информацию о своей команде и о том, чего хотите достичь, мы сможем оказать дополнительную помощь.

0

Windows фактически передает всю необработанную командную строку как одну строку в программу; см. GetCommandLine. Когда вы пишете main(int argc, char **argv), библиотека времени выполнения C, с которой связана ваша программа, отвечает за разделение командной строки на слова в вашем argv.

So Нам нужна дополнительная информация: Какова ваша оболочка, как вы вызываете свою команду и какую библиотеку времени выполнения вы используете? Проблема, которую вы видите, определенно не сама Windows, и я не могу воспроизвести ее здесь с помощью cmd.exe и CRT MSVC.

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

Если я использую CRT Cygwin, и работать с Cygwin в Bash оболочки, то я не вижу проблему либо.

 
C:\>C:\cygwin\bin\bash -l 
$ cd /cygdrive/c 
$ cc test.c 
$ ./a.exe '*' 
2 
[0] <./a> 
[1] <*> 
$ 

Это только если я пытаюсь смешивать их — запускать программу, используя CRT Cygwin от ЦМД.ехе — где я потенциально видеть ваши проблемы

 
$ 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:\> 
+0

Двойные кавычки не работают для меня - но я использую Windows 7 ЦМД и GCC с тестовой программой. Какую версию cmd.exe вы использовали? –

+1

Хорошо, я понял: это вещь mingw32, см. Https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html –