Sous Unix, je pourrais courir myscript '"test"'
et j'obtiendrais "test"
.
Dans Windows, cmd
je reçois 'test'
.
Comment puis-je passer des guillemets doubles comme paramètre? J'aimerais savoir comment faire cela manuellement à partir d'une cmd
fenêtre pour ne pas avoir à écrire un programme pour tester mon programme.
myscript \"test\"
Réponses:
Je ne peux pas reproduire rapidement les symptômes: si j'essaye
myscript '"test"'
avec un fichier batchmyscript.bat
contenant juste@echo.%1
ou même@echo.%~1
, j'obtiens tous les guillemets:'"test"'
Peut-être que vous pouvez essayer le caractère d'échappement
^
comme cecimyscript '^"test^"'
:?la source
wscript
la faute! Laissez-le à Windows :)cmd
.Une autre façon d'échapper aux guillemets (bien que probablement pas préférable), que j'ai trouvé utilisée à certains endroits, consiste à utiliser plusieurs guillemets doubles . Dans le but de rendre le code des autres lisible, je vais vous expliquer.
Voici un ensemble de règles de base:
program param1 param2 param 3
passeront quatre paramètresprogram.exe
:param1
,param2
,param
et3
.program one two "three and more"
passera trois paramètresprogram.exe
:one
,two
etthree and more
.hello"to the entire"world
agit comme un paramètre:helloto the entireworld
."Tim says, ""Hi!"""
agira comme un paramètre:Tim says, "Hi!"
Il existe donc trois types différents de guillemets doubles: les guillemets qui s'ouvrent, les guillemets qui se ferment et les guillemets qui agissent comme du texte brut.
Voici la ventilation de cette dernière ligne déroutante:
Ainsi, le texte joint effectivement quatre groupes de caractères (un avec rien, cependant):
Tim says,
est le premier, enveloppé pour échapper les espaces"Hi!
est le second, non enveloppé (il n'y a pas d'espaces)est le troisième, un groupe de guillemets doubles n'emballant rien
"
est le quatrième, la citation de fermeture déballée.Comme vous pouvez le voir, le groupe de guillemets doubles n'encapsulant rien n'est toujours nécessaire car, sans lui, les guillemets doubles suivants ouvriraient un groupe entre guillemets au lieu d'agir comme du texte brut.
À partir de là, il devrait être reconnaissable que, par conséquent, entre guillemets intérieurs et extérieurs, trois guillemets doubles agissent comme des guillemets doubles non échappés en texte brut:
s'imprimera
Tim said to him, "What's been happening lately?"
comme prévu. Par conséquent, trois guillemets peuvent toujours être utilisés de manière fiable comme échappatoire.Cependant, en le comprenant, vous pouvez noter que les quatre guillemets à la fin peuvent être réduits à seulement deux car cela ajoute techniquement un autre groupe vide inutile.
Voici quelques exemples pour le clôturer:
Note finale: je n'ai lu rien de tout cela à partir d'un tutoriel - j'ai tout inventé en expérimentant. Par conséquent, mon explication n'est peut-être pas vraie en interne. Néanmoins, tous les exemples ci-dessus sont évalués comme donnés, validant (mais non prouvant) ma théorie.
J'ai testé cela sur Windows 7, 64 bits en utilisant uniquement des appels * .exe avec le passage de paramètres (pas * .bat, mais je suppose que cela fonctionne de la même manière).
la source
Essaye ça:
"" échapper à un seul "dans le paramètre.
la source
myscript """test test"""
et cela ne fonctionne pas (le premier paramètre est transmis comme"test
. En réalité, vous avez besoin de trois guillemets:myscript """"test test""
le troisième guillemet à la fin peut être ignoré, cependant.char **argv
de mon lanceur C à un autre processus en utilisant des fonctions commespawn
ouexec
. Je vous remercie. :-)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: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 argumenta"b c
, un argument>
et un argumentd
.Si à la place foo interprète un guillemet double
""
comme un guillemet double littéral, alors démarrez votre programme commeLe 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 commeEnsuite, 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 celamyscript
est également disponible sur Unix, peut\"
- être fait - il l'affaire. Essayerou, si vous n'avez pas besoin de redirection,
la source
J'appelle PowerShell à partir de cmd, et en passant des guillemets et aucun des deux échappements ici n'a fonctionné. L'accent grave a travaillé pour échapper aux guillemets doubles sur ce pro de surface Win 10.
Voici les sorties que j'ai obtenues pour que d'autres personnages échappent à un guillemet double:
L'utilisation d'une autre citation pour échapper à une citation n'a entraîné aucune citation. Comme vous pouvez le voir, les caractères eux-mêmes ont été tapés, mais n'ont pas échappé aux guillemets.
la source