Передать строку, содержащую символ * (звездочка), в качестве аргумента командной строки в оболочке Windows - PullRequest
3 голосов
/ 03 марта 2010

Я ищу способ передать строку, содержащую символ "*", в исполняемый файл через командную строку.

  command.exe 3*2

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

Помещение "3 * 2" между двойными кавычками не помогает, все та же проблема.

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

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

Ответы [ 3 ]

6 голосов
/ 04 марта 2010

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

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

Windows (Windows 7):

C:\Users\Frank>echo *
*

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

Linux (bash на 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

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

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

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

1 голос
/ 04 марта 2010

вы можете попробовать убежать

command.exe 3^*2
0 голосов
/ 04 марта 2010

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

Итак, нам нужна дополнительная информация : какая у вас оболочка, как вы вызываете свою команду и какую библиотеку времени выполнения C вы используете? Проблема, которую вы видите, определенно связана не с самой 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] <*>
$

Это только если я попытаюсь смешать их & mdash; запустить программу с использованием CRT Cygwin из cmd.exe & mdash; где я потенциально вижу вашу проблему

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