Question Utilisation de barre oblique inverse pour échapper des caractères dans cmd.exe (commande runas par exemple)


Je vois que le caret est le caractère d'échappement documenté.

Mais, j'ai un exemple montrant que pour le double guillemet, ^ ne fonctionne pas et vous devez utiliser \

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

Pourquoi est-ce et où est-il documenté?


4
2017-08-30 09:40


origine




Réponses:


Un des exemples dans RUNAS /? montre cette syntaxe. Le caret est le caractère d’évasion pour CMD.EXE mais dans Windows, les programmes individuels sont libres d'implémenter leurs propres caractères d'échappement et globalisation.


4
2017-08-30 10:00



intéressant .. et btw .. que fait cmd.exe avec les citations non échappées à la fin? les garde-t-il, si oui pourquoi? Ou les enlève-t-il… si oui, pourquoi en avaient-ils besoin? - barlop
@barlop: Voir Michael répondre. - Dennis Williamson
êtes-vous sûr \ "est interprété par runas et non par cmd.exe? compiler cette w.c pastebin.com/28Q2Wxxr  to w.exe Comparer a) w "a a" b) w \ "a a \" c) w ^ "a a ^" Notez ce qui se passe avec b en particulier. Je suppose que c'est le shell cmd qui traite \ comme un caractère d'échappement. - barlop
Bien que cmd.exe ne l'ait pas interprété, ce n'est pas le programme non plus, c'est le runtime qui divise les arguments. Je ne suis pas sûr que l'on puisse appeler le programme libre de le mettre en œuvre. plus comme la façon dont le compilateur l'a implémenté ou la façon dont le compilateur l'implémente pour les programmes. tous les programmes écrits en supposant, ms visuel c, analyserait argsv "ainsi" msdn.microsoft.com/en-us/library/a1y7w461.aspx - barlop


En cmd, \ Est-ce que ne pas échapper ". Voici une preuve rapide et une explication:

  1. Courir echo "" & echo 1. (& est un caractère spécial dans cmd, left & right signifie courir left puis courir right.) Nous pouvons voir que les deux echo "" et echo 1 sont exécutés avec succès.

  2. Ensuite, courez echo " & 1234. Nous pouvons voir que la sortie est " & 1234. C'est parce que l'ouverture " n'a pas été fermé, et donc tout ce qui suit est interprété comme une chaîne, y compris le caractère spécial &.

  3. Courir echo "\" & 1234.

    • Si \ n'échappe pas à la suivante ", l'ouverture " ne sera pas fermé et les caractères & 1234 sera interprété comme faisant partie de la chaîne.

    • Si \ ne parvient pas à échapper à la suivante ", cette Suivant " va fermer la chaîne et & 1234 volonté ne pas être interprété comme faisant partie de la chaîne.

    Dans la sortie, nous ne voyons pas & 1234 interprété comme faisant partie de la chaîne. Cela prouve que \ n'a pas réussi à s'échapper ".

Alors qu'est-ce qui échappe " entre guillemets pour le passage des arguments? Tandis que ^ travaillera en dehors des devis (facilement prouvé via echo ^" & echo 1), il n'échappe pas aux guillemets entre guillemets.

En effet, comment pouvons-nous obtenir quelque chose d'aussi simple que echo """  &  echo 1 travailler?

le ^ carboniser? ...Nan, echo "^"" & echo 1 les sorties "^"", et pas """.

Que dire de la " char lui-même? ...Nan, echo """" & echo 1  les sorties """", et pas """.

Le fait est, il n'y a rien qui va échapper " entre guillemets pour le passage des arguments. Vous pouvez vous en occuper pendant quelques années et ne trouver aucune solution. Ce ne sont que quelques-unes des limitations inhérentes au script cmd.

Cependant, les bonnes nouvelles sont que vous aurez probablement jamais rencontrez une situation dans laquelle vous devez le faire. Bien sûr, il n'y a aucun moyen d'obtenir echo """  &  echo 1 pour travailler, mais ce n'est pas une grosse affaire car c'est simplement un problème artificiel que vous ne rencontrerez probablement jamais.

Par exemple, considérez runas. Cela fonctionne bien sans avoir besoin de s'échapper " entre guillemets parce que runas a connu qu'il n'y a aucun moyen de le faire et fait des ajustements internes pour contourner le problème. runas inventé ses propres règles d'analyse (runas /flag "anything even including quotes") et n'interprète pas les arguments cmd de la manière habituelle. La documentation officielle de ces syntaxes spéciales est assez rare (ou inexistante). À part /? et help, il s'agit principalement d'essais et d'erreurs.


6
2017-08-26 01:33





le \ signe fait interpréter le prochain signe comme interprète personnage au lieu d'un identifiant.

Vous le voyez beaucoup dans le code aussi:

"Hello \"World\""

c'est interprété comme

Hello "World"

dans votre exemple, afin de passer les arguments à cmd, il doit être inclus dans "". Mais puisque les arguments à cmd contient "(et cela mettrait fin à l'enceinte), ils sont ajoutés par \. Si le "" n'aurait pas été là, le /k dir \"%userprofile%\" aurait été interprété comme des arguments à runas, ne pas cmd.

La raison pour laquelle ils insèrent le% userprofile% est qu’il s’agit d’une variable d’environnement et qu’elle sera remplacée par du texte qui pourrait contenir des espaces, ce qui (pour la même raison que ci-dessus) rendrait l’argument cmd Incorrect.


3
2017-08-30 13:48



Il me semble que RunAs "needs" cite quand ce deuxième paramètre, le paramètre du programme, a un espace. Sinon, il pense qu’on lui donne plus de paramètres qu’il ne l’est. En théorie, les runas auraient pu être écrits (je veux dire codés) pour aboutir à la fin, comme un paramètre sans citation nécessaire. En contraste avec ceci. cmd.exe par exemple cmd / c dir a b Cela prend -dir un b- comme un paramètre. - barlop
En outre, un point plus complexe, il me semble que les runas pourraient se passer de \ "Mais ne peut pas parce qu’il prend le" comme début et la fin "comme une fin. et finir, alors il ne serait pas nécessaire que les moyens soient \ "par exemple même une mauvaise ligne comme C: \> runas / user: Administrateur "runas / user: Administrateur \" cmd / k dir \ "% userprofile% \" \ "Si tout était" et non \ "alors théoriquement vous peut encore le traiter. Mais pas à cause de la manière dont les runas ont été écrites. - barlop
@barlop: Ne pense pas à cmd comme argument pour runas, car ce n'est pas le cas. L'argument de runas est cmd /k dir \"%userprofile%\". Je n'ai pas le temps maintenant, mais donnez-moi quelques heures et je devrais pouvoir vous expliquer un programme simple en C ++ et comment ces programmes interprètent les arguments. Je pense que ce serait plus clair. Alors, réponse liée à changer - Default
En fait, je peux comprendre et juste n'était pas clair. Je connais la méthode principale et argsv. J'ai entendu dire qu'ils prennent tous les arguments dans leur premier élément? Est-ce correct? En ce qui concerne la mention de cmd.exe, il y a une ambiguïté, à savoir si je veux dire cmd.exe dans cette ligne ou le fichier cmd.exe externe dans lequel la ligne est écrite. La seule fois où j'ai mentionné cmd.exe dans ce que j'ai écrit dans ces commentaires, Etait cmd / c dir ab Et j'ai raison que -dir un b- est 1 paramètre. Mais on m'a dit (je ne sais pas si correctement) que tous les programmes Windows obtiennent tous leurs arguments comme une chaîne, sans doute argsv [0], puis les divisent eux-mêmes - barlop
@ Michael, si vous le voulez dans Why form .. Je pourrais demander. Pourquoi cmd / c dir est-il interprété comme cmd / c "dir a b" Alors qu'avec runas, le paramètre du programme (Voir runas /?) Veut des citations. Je pense que les runas pourraient facilement être codés pour ne pas en vouloir. Depuis que me semble théoriquement, il ne devrait pas en avoir besoin. - barlop