¿Cómo ejecutar el comando cmd interno desde el shell msys?

19

La CMDutilidad de Windows tiene una serie de comandos internos, como mklink. ¿Cómo se pueden usar desde la msyscáscara?

De CMDla documentación de , el /cinterruptor se puede utilizar para ejecutar un comando y salir; Pero esto no parece funcionar.

  • Si lo hago, cmd /c mklinkel mklinkcomando no se ejecuta y CMDno se cierra el shell.

Antes de presionar Enter:

ingrese la descripción de la imagen aquí

Después:

ingrese la descripción de la imagen aquí

Captura de pantalla de Process Monitor:

ingrese la descripción de la imagen aquí

  • Intentar ejecutar el comando como un proceso en segundo plano: cmd /c mklink &aparentemente funciona: el mklinkcomando se ejecuta, pero el CMDshell no finaliza. Cada vez que Enterse presiona, CMDse convertirá en el shell activo.
Mihai Rotaru
fuente
cmd /c mklinkfunciona para mí con mi shell C, con Cygwin bashy con cmd.exe. Pero tenía que estar funcionando de forma elevada o de lo contrario recibí quejas, "No tienes privilegios suficientes para realizar esta operación". No lo he intentado msysporque no lo tengo instalado, pero estoy escéptico de que ese sea el problema. Sospecho que está sucediendo algo más. Puede ser útil una transcripción o una captura de pantalla de lo que hizo y lo que sucedió.
Nicole Hamilton
@NicoleHamilton, capturas de pantalla agregadas. Para mklinkque funcione, el shell realmente debe ejecutarse como administrador; pero mi problema es que no puedo ejecutar ninguno de los comandos internos sin que el cmdshell se haga cargo o se ejecute en segundo plano. Este problema también está presente para comandos más simples que no requieren administrador, como dir.
Mihai Rotaru
¿Tiene un alias, definición de procedimiento o script que pueda estar interceptando cmd?
Nicole Hamilton
@NicoleHamilton, no; Tomé @Maxiums' asesoramiento y corrió Process Monitor, y como se puede ver en la captura de pantalla I adjunto, el tema es que msyslos convertidos /ca c:\ . La respuesta es escapar y ejecutar el comando como cmd //c mklink.
Mihai Rotaru

Respuestas:

14
  1. Busque en su% PATH% cmd.cmd o cmd.bat. Pueden interferir con su cmd

  2. Ejecute Process Monitor y ejecute su cmd /c mklink. Examine el registro de ProcMon en busca de comandos realmente ejecutados.

Maximus
fuente
26
Process Monitor ayudó a rastrear el problema. Es que msysva a convertir /ca c:\ ; necesita ser escapado: cmd //c mklink. La forma en que se realizan estas conversiones se explica aquí .
Mihai Rotaru
1
@MihaiRotaru este comentario debería ser una respuesta
laktak
2

win7 / cygwin / bash tuvo el mismo problema, la solución es iniciar cmd dos veces y convertir barras inclinadas en barras invertidas según sea necesario por cmd (por ejemplo): 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

mosh
fuente
1

Process Monitor ayudó a rastrear el problema. Es que msysva a convertir /ca c:\; necesita ser escapado: cmd //c mklink. La forma en que se realizan estas conversiones se explica aquí . - Mihai Rotaru 1 de enero de 13 a las 21:32

No pude lograr que esto funcionara solo por el comentario de Mihai , porque el camino todavía contenía barras diagonales /, y se mklinkquejó de que /msys64no era un cambio válido.

Entonces escribí un script por lotes para que funcione.

Así es como llamo a mi script por lotes desde MSYS:

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

Y, la secuencia de comandos por lotes toma esos dos caminos, y convierte /a \, utilizando la :OLD=NEWsintaxis de la expansión de parámetros para los reemplazos de cadenas. 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 Esto es similar a la ${PARAM:/OLD/NEW}sintaxis de bash , para aquellos familiarizados con ella

jpaugh
fuente