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 répété: Un meilleur moyen de comprendre la citation et l'échappement des arguments de ligne de commande Windows .
Quelques essais et erreurs supplémentaires conduisent à la directive suivante:
Échappez à chaque double guillemet "
avec un signe d'insertion ^
. Si vous voulez d' autres caractères avec une signification particulière pour l'interpréteur de commandes de Windows (par exemple <
, >
, |
, &
) doivent être interprétés comme des caractères réguliers au lieu, puis les échapper avec un accent circonflexe, aussi.
Si vous voulez que votre programme foo reçoive le texte de la ligne de commande "a\"b c" > d
et redirige sa sortie vers le fichier out.txt , démarrez votre programme comme suit à partir du shell de commande Windows:
foo ^"a\^"b c^" ^> d > out.txt
Si foo interprète \"
comme un guillemet double littéral et s'attend à ce que des guillemets doubles non échappés délimitent les arguments qui incluent des espaces, alors foo interprète la commande comme spécifiant un argument a"b c
, un argument >
et un argument d
.
Si à la place foo interprète un guillemet double ""
comme un guillemet double littéral, alors démarrez votre programme comme
foo ^"a^"^"b c^" ^> d > out.txt
Le point clé du document cité est que, pour le shell de commande Windows, un guillemet double non échappé déclenche le basculement entre deux états possibles.
Quelques essais et erreurs supplémentaires impliquent que dans l'état initial, la redirection (vers un fichier ou un tube) est reconnue et un curseur ^
échappe à un guillemet double et le curseur 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é. Faisons référence à ces états comme «extérieur» et «intérieur», respectivement.
Si vous souhaitez rediriger la sortie de votre commande, alors le shell de commande doit être dans l'état extérieur lorsqu'il atteint la redirection, il doit donc y avoir un nombre pair de guillemets doubles non échappés (par un caret) précédant la redirection. foo "a\"b " > out.txt
ne fonctionnera pas - le shell de commande passe le tout "a\"b " > out.txt
à foo en tant qu'arguments de ligne de commande combinés, au lieu de passer uniquement "a\"b "
et de rediriger 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 s'agit d'un caractère ordinaire et non d'un caractère d'échappement, il "a\^"b " > out.txt
est donc passé à foo .
La seule façon qui (espérons-le) fonctionne toujours 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 caractères carats. Si foo est interprété \"
comme un guillemet double littéral, vous pouvez l'appeler comme
foo "a\"b c"
Ensuite, foo reçoit "a\"b c"
comme argument combiné le texte et peut l'interpréter comme un argument unique égal à a"b c
.
Maintenant - enfin - à la question initiale. myscript '"test"'
appelé à partir du shell de commande Windows passe '"test"'
à myscript . Apparemment, myscript interprète les guillemets simples et doubles comme des délimiteurs d'argument et les supprime. Vous devez déterminer ce que myscript accepte comme guillemet double littéral, puis le spécifier dans votre commande, en utilisant ^
pour échapper tous les caractères qui ont une signification particulière pour le shell de commande Windows. Étant donné que cela myscript
est également disponible sur Unix, peut \"
- être fait - il l'affaire. Essayer
myscript \^"test\^"
ou, si vous n'avez pas besoin de redirection,
myscript \"test\"
myscript \"test\"