En ce qui concerne la question supplémentaire de savoir pourquoi les citations supplémentaires sont nécessaires: cela est décrit dans le hel p retourné par cmd /?
, en particulier
Si/C ou/K est spécifié, le reste de la ligne de commande après le commutateur est traité comme une ligne de commande, où est utilisé la logique suivante pour traiter citation («) caractères:
1. [Special case, not relevant here]
2. Otherwise, old behavior is to see if the first character is
a quote character and if so, strip the leading character and
remove the last quote character on the command line, preserving
any text after the last quote character.
Ainsi, si le premier (caractère non-espace) de la commande est une citation, vous avez besoin d'une paire de guillemets autour de la commande entière.
Note complémentaire: la combinaison de la réponse de MC ND avec le mien, la première ligne de commande dans la question est interprétée comme ceci: nous commençons par
"cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"
qui devient
%ComSpec% /C" "C:\\Program Files\ABC\xyz.exe" -register="abc"
due à la règle qui remplace cmd
->%ComSpec%
combinée avec le bug/fonctionnalité qui rejette la marque de citation supplémentaire; cela devient alors
"C:\\Program Files\ABC\xyz.exe" -register="abc
en raison de la règle qui supprime les première et dernière guillemets lors du traitement /C
.
Les règles du système de fichiers Win32 jeter la barre oblique inverse supplémentaire, donc l'exécutable lancé est
C:\Program Files\ABC\xyz.exe
et l'exécutable ignore sans doute le manque gros citation dans son argument.
La partie impaire est que le premier format fonctionne ... Je peux reproduire le comportement mais je ne peux pas l'expliquer! Il ne fonctionne pas avec les exécutables autres que 'cmd', donc il semble que ce soit un cas spécial codé en dur. :-( –