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

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

La CMDutilidad de Windows tiene varios comandos internos, como mklink. ¿Cómo se pueden utilizar desde el msyscaparazón?

DeCMDla documentación, 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 sale del 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 del Monitor de proceso:

ingrese la descripción de la imagen aquí

  • Intentar ejecutar el comando como 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 caparazón activo.

Respuesta1

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

  2. CorrerMonitor de procesoy ejecuta tu cmd /c mklink. Examine el registro de ProcMon en busca de comandos realmente ejecutados.

Respuesta2

win7/cygwin/bash tuvo el mismo problema, la solución es iniciar cmd dos veces y convertir barras diagonales en barras invertidas según lo necesite 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

Respuesta3

Process Monitor ayudó a localizar el problema. Es lo que msysse convertirá /ca c:\; es necesario escapar: cmd //c mklink. Se explica la forma en que se realizan estas conversiones.aquí. -Mihai Rotaru01 de enero, 2013 a las 21:32

No pude hacer que esto funcionara segúnEl comentario de Mihai.solo, porque la ruta todavía contenía barras diagonales /y mklinkse quejó de que /msys64no era un cambio válido.

Así que escribí un script por lotes para que funcionara.

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

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

Y el script por lotes toma esas dos rutas y las convierte /a \, utilizando la :OLD=NEWsintaxis de expansión de parámetros para 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 ${PARAM:/OLD/NEW}la sintaxis de bash, para quienes estén familiarizados con él.

Respuesta4

Ampliando el comentario de Mihai Rotaru:

Process Monitor ayudó a localizar el problema. Es lo que msysse convertirá /ca c:\; es necesario escapar: cmd //c mklink. Se explica la forma en que se realizan estas conversiones.aquí. -Mihai Rotaru01 de enero, 2013 a las 21:32

Esta /cconversión c:\también se puede evitar para algunos o todos los argumentos utilizando la variable de entorno MSYS2_ARG_CONV_EXCL.

P.ej

$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"

(Cuidado ya que '*'y "*"significará cosas diferentes).

Citando elDocumentos MSYS2:

MSYS2_ARG_CONV_EXCLpuede ser *excluir todo o una lista de uno o más prefijos de argumentos separados por ;, como MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test [...]

información relacionada