Comment exécuter la commande cmd interne à partir du shell msys?


19

L' CMDutilitaire Windows possède un certain nombre de commandes internes, telles que mklink. Comment peuvent-ils être utilisés depuis la msyscoque?

D'après CMDla documentation de , le /ccommutateur peut être utilisé pour exécuter une commande et quitter; mais cela ne semble pas fonctionner.

  • Si je fais, cmd /c mklinkla mklinkcommande n'est pas exécutée et le CMDshell n'est pas quitté.

Avant d'appuyer sur Entrée:

entrez la description de l'image ici

Après:

entrez la description de l'image ici

Capture d'écran de Process Monitor:

entrez la description de l'image ici

  • Essayer d'exécuter la commande en arrière-plan: cmd /c mklink &fonctionne apparemment - la mklinkcommande est exécutée, mais le CMDshell n'est pas terminé. Chaque fois que vous Enterappuyez sur, CMDdevient le shell actif.

cmd /c mklinkfonctionne pour moi avec mon shell C, avec Cygwin bashet avec cmd.exe. Mais je devais être en cours d'exécution élevée ou bien j'ai reçu des plaintes, "Vous n'avez pas le privilège suffisant pour effectuer cette opération." Je n'ai pas essayé msyscar je ne l'ai pas installé mais je suis sceptique que c'est le problème. Je soupçonne qu'il se passe autre chose. Une transcription ou une capture d'écran de ce que vous avez fait et de ce qui s'est passé pourrait être utile.
Nicole Hamilton

@NicoleHamilton, captures d'écran ajoutées. Pour mklinkfonctionner, le shell doit en effet être exécuté en tant qu'administrateur; mais mon problème est que je ne peux exécuter aucune des commandes internes sans que le cmdshell prenne le relais ou s'exécute en arrière-plan. Ce problème est également présent pour les commandes plus simples qui ne nécessitent pas d'administration, telles que dir.
Mihai Rotaru

Avez-vous un alias, une définition de procédure ou un script susceptible d'intercepter cmd?
Nicole Hamilton

@NicoleHamilton, non; J'ai suivi les conseils de @Maxiums et j'ai exécuté Process Monitor, et comme on peut le voir dans la capture d'écran que j'ai jointe, le problème est qu'il se msystransforme /cen c:\ . La réponse est de l'échapper et d'exécuter la commande en tant que cmd //c mklink.
Mihai Rotaru

Réponses:


14
  1. Recherchez dans% PATH% cmd.cmd ou cmd.bat. Ils peuvent interférer avec votre cmd

  2. Exécutez Process Monitor et exécutez votre cmd /c mklink. Examinez le journal ProcMon pour les commandes réellement exécutées.


26
Process Monitor a aidé à localiser le problème. C'est cela qui msysse convertira /cen c:\ ; il doit être échappé: cmd //c mklink. La façon dont ces conversions sont effectuées est expliquée ici .
Mihai Rotaru

1
@MihaiRotaru ce commentaire devrait être une réponse
laktak

2

win7 / cygwin / bash a eu le même problème, la solution consiste à lancer deux fois cmd et à convertir les barres obliques en barres obliques inverses selon les besoins de cmd (par exemple): REPO_DIR=${REPO_DIR////\\} # Example, Turn c:/cvs into c:\cvs for cmd
cmd /C "cmd /C mklink /D .Repo $REPO_DIR" # launch cmd /C cmd /C cmd


1

Process Monitor a aidé à localiser le problème. C'est cela qui msysse convertira /cen c:\; il doit être échappé: cmd //c mklink. La façon dont ces conversions sont effectuées est expliquée ici . - Mihai Rotaru 1 janvier 13 à 21:32

Je ne pouvais pas faire fonctionner cela sur la base du seul commentaire de Mihai , car le chemin contenait toujours des barres obliques /, et se mklinkplaignait que ce /msys64n'était pas un commutateur valide.

J'ai donc écrit un script batch pour le faire fonctionner.

Voici comment j'appelle mon script de commandes à partir de MSYS:

 $ mingw_ln.bat "$destination" "$targetpath"

Et, le script de commandes prend ces deux chemins et se convertit /en \utilisant la :OLD=NEWsyntaxe d'expansion des paramètres pour les remplacements de chaînes. 1

set LINK=%1
set TARGET=%2

REM Convert POSIX paths to Windows paths
set LINK=%LINK:/=\%
set TARGET=%TARGET:/=\%

mklink /D %LINK% %TARGET%

1 Ceci est similaire à la ${PARAM:/OLD/NEW}syntaxe de bash , pour ceux qui la connaissent

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.