Le 2ème document cité par Peter Mortensen dans son commentaire sur la réponse de Codesmith a rendu les choses beaucoup plus claires pour moi. Ce document a été écrit par windowsinspired.com. Le lien a été répété : Une meilleure façon de comprendre la citation et l'échappement des arguments de la ligne de commande Windows .
Quelques essais et erreurs supplémentaires permettent d'aboutir à la ligne directrice suivante :
Échapper à chaque guillemet double "
avec un caret ^
. Si vous souhaitez utiliser d'autres caractères ayant une signification particulière pour l'interpréteur de commandes Windows (par exemple , <
, >
, |
, &
) pour qu'ils soient interprétés comme des caractères normaux à la place, alors échappez-les également avec un caret.
Si vous voulez que votre programme foo pour recevoir le texte de la ligne de commande "a\"b c" > d
et redirige sa sortie vers le fichier out.txt puis lancez votre programme comme suit à partir du shell de commande Windows :
foo ^"a\^"b c^" ^> d > out.txt
Si foo interprète \"
en tant que guillemet double littéral et s'attend à ce que des guillemets doubles non récupérés délimitent les arguments qui incluent des espaces, alors foo interprète la commande comme spécifiant un seul argument a"b c
un argument >
et un argument d
.
Si au contraire foo interprète un guillemet double ""
en tant que guillemet double littéral, puis lancez votre programme en tant que
foo ^"a^"^"b c^" ^> d > out.txt
La principale conclusion du document cité est que, pour l'interpréteur de commandes Windows, un guillemet double non masqué déclenche la commutation entre deux états possibles.
Après quelques essais et erreurs supplémentaires, il s'avère que dans l'état initial, la redirection (vers un fichier ou un tuyau) est reconnue et un signe d'insertion. ^
échappe un guillemet double et le signe d'insertion est supprimé de l'entrée. Dans l'autre état, la redirection n'est pas reconnue et un signe d'insertion n'échappe pas à un guillemet double et n'est pas supprimé. Nous appellerons ces états "extérieur" et "intérieur", respectivement.
Si vous voulez rediriger la sortie de votre commande, l'interpréteur de commande doit être dans l'état extérieur lorsqu'il atteint la redirection, et il doit donc y avoir un nombre pair de guillemets doubles non masqués (par caret) précédant la redirection. foo "a\"b " > out.txt
ne fonctionnera pas -- l'interpréteur de commandes transmet l'intégralité de la commande "a\"b " > out.txt
a foo comme arguments combinés de la ligne de commande, au lieu de transmettre uniquement "a\"b "
et en redirigeant la sortie vers out.txt .
foo "a\^"b " > out.txt
ne fonctionnera pas non plus, car le signe d'insertion ^
est rencontré dans l'état intérieur où il est un caractère ordinaire et non un caractère d'échappement, donc "a\^"b " > out.txt
est transmis à foo .
La seule façon qui fonctionne toujours (espérons-le) est de garder le shell de commande toujours dans l'état extérieur, car alors la redirection fonctionne.
Si vous n'avez pas besoin de redirection (ou d'autres caractères ayant une signification particulière pour le shell de commande), vous pouvez vous passer des carets. Si foo interprète \"
comme un guillemet double littéral, alors vous pouvez l'appeler en tant que
foo "a\"b c"
Puis foo reçoit "a\"b c"
comme son texte d'arguments combinés et peut l'interpréter comme un seul argument égal à a"b c
.
Maintenant, et pour finir, à la question initiale. myscript '"test"'
appelé depuis le shell de commande Windows passe '"test"'
a myscript . Apparemment, myscript interprète les guillemets simples et doubles comme des délimiteurs d'arguments et les supprime. Vous devez déterminer ce que myscript accepte comme un guillemet double littéral et le spécifie ensuite dans votre commande, en utilisant ^
pour échapper à tous les caractères qui ont une signification spéciale pour le shell de commande Windows. Étant donné que myscript
est également disponible sur Unix, peut-être \"
fait l'affaire. Essayez
myscript \^"test\^"
ou, si vous n'avez pas besoin de redirection,
myscript \"test\"
3 votes
Cela fait des années que je n'ai pas touché à une machine Windows, mais le caractère d'échappement standard (barre oblique inversée) ne fonctionne-t-il pas ?
myscript \"test\"
0 votes
Non. Je reçois \test\. Je soupçonne que c'est parce que Windows utilise \ au lieu de /, de sorte que la barre oblique inversée ne peut pas être utilisée comme échappatoire. Mais je ne sais pas vraiment.
1 votes
Je ne sais pas quelle version de Windows vous utilisez, mais le système "\" fonctionne bien sous Windows 7 (Ultimate). Il y a une autre façon de le faire, en traitant les guillemets multiples (c'est-à-dire que """ devient " ou quelque chose comme ça), mais je n'arrive pas à savoir quand et comment cela fonctionne.
3 votes
Duplicata possible de Échapper les guillemets doubles dans le lot script