2010-03-03 8 views
2

Je cherche un moyen de transmettre une chaîne contenant le caractère "*" à un exécutable via la ligne de commande.Passer une chaîne contenant le caractère * (astérisque) comme argument de ligne de commande dans Windows Shell

command.exe 3*2 

Je veux passer la chaîne 3 * 2. Ce que fait Windows à la place est de rechercher dans le répertoire courant les fichiers correspondant au masque de fichier "3 * 2" et de passer tous les fichiers trouvés à command.exe

Mettre "3 * 2" entre guillemets n'aide pas, même problème.

J'ai également essayé '3 * 2' (entre guillemets simples), mais cette chaîne entière (y compris les guillemets simples) est passée, ce qui n'est pas ce dont j'ai besoin.

Y at-il un moyen de passer la chaîne 3 * 2 (sans guillemets) à la commande?

Répondre

6

Dans les commandes Windows, la commande que vous exécutez est responsable de l'expansion des caractères génériques présents dans les paramètres. Ce comportement est différent de celui d'Unix et de ses amis, où l'extension générique est généralement effectuée par le shell.

Un exemple simple le démontre.

de Windows (Windows 7):

C:\Users\Frank>echo * 
* 

Comme vous pouvez le voir, la commande des sorties paramètre exactement comme transmise par la ligne de commande.

Linux (bash sur Linux CentOS 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 

Ici, le paramètre wild card est remplacé par le shell à une liste de fichiers/répertoires dans le répertoire courant. Par conséquent, si votre exécutable gère les caractères génériques en les développant, vous ne pouvez pas faire grand-chose à ce sujet. Le comportement concret dépend de votre commande.

Si vous fournissez plus de détails sur votre commande et ce que vous voulez réaliser, nous pourrions peut-être vous donner plus d'aide.

0

Windows passe réellement la totalité de la ligne de commande brute en tant que chaîne unique à un programme; voir GetCommandLine. Lorsque vous écrivez main(int argc, char **argv), la bibliothèque d'exécution C avec laquelle votre programme est lié est responsable de la division de la ligne de commande en mots dans votre argv.

Nous avons donc besoin de plus d'informations: quel est votre shell, comment invoquez-vous votre commande et quelle bibliothèque d'exécution C utilisez-vous? Le problème que vous voyez n'est définitivement pas Windows lui-même, et je ne peux pas le reproduire ici avec cmd.exe et le CRT de 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:\> 

Si j'utilise CRT Cygwin, et courir de shell Bash Cygwin, alors je ne vois pas non plus un problème.

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

Il est seulement si j'essaie de les mélanger — exécuter un programme utilisant CRT Cygwin de cmd.exe — où je vois votre problème potentiellement

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

mais je ne vois pas de problème avec des guillemets doubles.

 
C:\>a.exe "*" 
2 
[0] <test.exe> 
[1] <*> 

C:\> 
+0

Les guillemets doubles ne fonctionnent pas pour moi - mais je suis en utilisant cmd Windows 7 et gcc avec votre programme de test. Quelle version de cmd.exe utilisiez-vous? –

+1

Ok, je l'ai compris: c'est une chose mingw32, voir https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html –

1

vous pouvez échapper

command.exe 3^*2