2014-04-29 7 views
2

J'essaye d'invoquer un exécutable en mettant la ligne suivante sur l'invite de commande. (Je sais que je peux appeler directement l'exe mais disons juste que j'ai pas d'autre façon de le faire en raison de certaines restrictions)cmd fonctionne mais C: Windows System32 cmd.exe ne fonctionne pas

"cmd /C" "C:\\Program Files\ABC\xyz.exe" -register="abc" 

lui-même Il est géré avec succès. /C est le paramètre à cmd.exe. Mais quand je fais

"C:\Windows\System32\cmd.exe /C" "C:\\Program Files\ABC\xyz.exe" -register="abc" 

Ça me donne une erreur

The directory name is invalid 

Toute idée pourquoi? Et comment puis-je résoudre ce problème? Je dois utiliser le chemin complet de cmd.exe.

+0

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. :-( –

Répondre

1

étrange, il semble:/

C:\Windows\System32\cmd.exe /C " "C:\\Program Files\ABC\xyz.exe" -register="abc" " 

Ceci travaux. Je ne sais pas pourquoi. Peut être les guillemets avant et après "C:\\Program Files\ABC\xyz.exe" -register="abc" sont requis. Souhaite que quelqu'un explique cela.

4

Essayez ceci:

"C:\Windows\System32\cmd.exe" /C " "C:\\Program Files\ABC\xyz.exe" -register="abc" " 

Par exemple:

"C:\Windows\System32\cmd.exe" /C " echo "Hello World" " 
"C:\Windows\System32\cmd.exe" /C " python -c " print 'Hello World' " 

Ces travaux sans aucun problème et les deux sortie "Bonjour tout le monde"

+0

+1 ou en évitant les chemins codés en dur; '"% COMSPEC% "/ C" C: \ Prog ... "' –

+0

Cela ne semble pas fonctionner non plus :( –

+0

@GaneshS OK, maintenant je comprends Vous auriez dû être beaucoup plus clair à propos de votre question, mais voilà, la réponse éditée: D – Sazid

1
"C:\Windows\System32\cmd.exe /C" 

recherche un fichier nommé C:\Windows\System32\cmd.exe /C.

Avez-vous déjà vu un fichier avec l'extension .exe /c?

format correct est:

"C:\Windows\System32\cmd.exe" /C 
+0

Si cela le cas, une idée "cmd/c" "C: \ Program Files \ ABC \ xyz.exe" -register = "abc" pourquoi cela fonctionne ?? –

+0

' "cmd/c" 'et' "cmd.exe" 'fonctionne,' "cmd.exe/c" 'ne fonctionne pas, semble utiliser des parseurs différents Attendons qu'un de nos experts réponde ... – Stephan

2

Comme l'a déclaré Stephan, la bonne façon de l'écrire est une des options suivantes

"C:\Windows\System32\cmd.exe" /C .... 
"%comspec%" /c .... 

La question est Why "cmd /c" .... works? Il fonctionne de la façon dont l'analyseur interprète la ligne.

Lorsque la ligne est readed et analysé, "cmd /c" est converti en

execute the command interpreter with the /c" ... arguments 

Il est exécuté comme

%comspec% /c "..... 

Cette substitution peut être facilement testée

set "ComSpec=c:\windows\system32\calc.exe" 
"cmd /c" echo hello 
+0

so' cmd' est différent de (par exemple) 'notepad'.' notepad' recherche dans le chemin un fichier 'notepad.xxx', où 'xxx' est' bat', 'cmd' ou' exe' (quelque chose, ce qui est dans '% pathext%'), alors que 'cmd' ne cherche pas' cmd.exe' mais semble être un sorte de "commande interne", qui exécute '% comspec%', peut-être comme un 'doskey'macro? – Stephan

+0

@Stephan, oui, c'est différent. Je ne sais pas si c'est lié, mais la commande 'start' fait quelque chose de similaire. Depuis son aide 'Lorsque vous exécutez une commande qui contient la chaîne" CMD "comme premier jeton sans extension ou qualificateur de chemin," CMD "est remplacé par la valeur de la variable COMSPEC. Cela empêche les utilisateurs de récupérer cmd à partir du répertoire courant. » –

+0

Il semble que la citation initiale soit rejetée en tant qu'effet secondaire (vraisemblablement involontaire) de la conversion de' cmd' en '% ComSpec%'. –

1

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.

+0

Grande aide ici. Merci beaucoup. :) –

Questions connexes