Come eseguire il comando cmd interno dalla shell msys?


19

L' CMDutilità di Windows ha una serie di comandi interni, come ad esempio mklink. Come possono essere usati dalla msysshell?

Dalla CMDdocumentazione , lo /cswitch può essere usato per eseguire un comando ed uscire; ma questo non sembra funzionare.

  • Se lo faccio, cmd /c mklinkil mklinkcomando non viene eseguito e la CMDshell non viene chiusa.

Prima di premere Invio:

inserisci qui la descrizione dell'immagine

Dopo:

inserisci qui la descrizione dell'immagine

Schermata di Process Monitor:

inserisci qui la descrizione dell'immagine

  • Tentativo di eseguire il comando come processo in background: cmd /c mklink &apparentemente funziona: il mklinkcomando viene eseguito, ma la CMDshell non viene terminata. Ogni volta che Enterviene premuto, CMDdiventerà la shell attiva.

cmd /c mklinkfunziona per me con la mia shell C, con Cygwin bashe con cmd.exe. Ma dovevo essere molto elevato, altrimenti ho ricevuto lamentele "Non hai i privilegi sufficienti per eseguire questa operazione". Non ho provato msysperché non l'ho installato ma sono scettico che è il problema. Sono sospetto che ci sia qualcos'altro in corso. Una trascrizione o una schermata di ciò che hai fatto e di quello che è successo potrebbero essere utili.
Nicole Hamilton

@NicoleHamilton, aggiunte schermate. Per mklinkfunzionare, la shell deve effettivamente essere eseguita come amministratore; ma il mio problema è che non posso eseguire nessuno dei comandi interni senza che la cmdshell subentri o funzioni in background. Questo problema è presente anche per comandi più semplici che non richiedono admin, come ad esempio dir.
Mihai Rotaru,

Hai un alias, una definizione di procedura o uno script che potrebbe intercettare cmd?
Nicole Hamilton,

@NicoleHamilton, no; Ho preso @Maxiums' consigli e corse Process Monitor, e come si può vedere nello screenshot ho attaccato, il problema è che msysconverte /ca c:\ . La risposta è fuggire ed eseguire il comando come cmd //c mklink.
Mihai Rotaru,

Risposte:


14
  1. Cerca nel tuo% PATH% cmd.cmd o cmd.bat. Potrebbero interferire con il tuo cmd

  2. Esegui Process Monitor ed esegui il tuo cmd /c mklink. Esaminare il registro ProcMon per i comandi realmente eseguiti.


26
Process Monitor ha aiutato a rintracciare il problema. È che msyssi convertirà /cin c:\ ; ha bisogno di essere sfuggito: cmd //c mklink. Il modo in cui vengono eseguite queste conversioni è spiegato qui .
Mihai Rotaru,

1
@MihaiRotaru questo commento dovrebbe essere una risposta
laktak

2

win7 / cygwin / bash ha avuto lo stesso problema, la soluzione è lanciare cmd due volte e convertire le barre in barre rovesciate come richiesto da cmd (ad esempio): 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 ha aiutato a rintracciare il problema. È che msyssi convertirà /cin c:\; ha bisogno di essere sfuggito: cmd //c mklink. Il modo in cui vengono eseguite queste conversioni è spiegato qui . - Mihai Rotaru, 1 gennaio 13 alle 21:32

Non riuscivo a farlo funzionare basandomi sul commento di Mihai da solo, perché il percorso conteneva ancora delle barre /in avanti e si mklinklamentava che /msys64non era un passaggio valido.

Quindi ho scritto uno script batch per farlo funzionare.

Ecco come chiamo il mio script batch da MSYS:

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

E, lo script batch prende questi due percorsi, e converte /a \, utilizzando la :OLD=NEWsintassi di espansione di parametro per le sostituzioni di stringa. 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 Questo è simile alla ${PARAM:/OLD/NEW}sintassi di bash , per chi ha familiarità con esso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.