La CMD
utilidad de Windows tiene varios comandos internos, como mklink
. ¿Cómo se pueden utilizar desde el msys
caparazón?
DeCMD
la documentación, el /c
interruptor se puede utilizar para ejecutar un comando y salir; pero esto no parece funcionar.
- Si lo hago,
cmd /c mklink
elmklink
comando no se ejecuta yCMD
no se sale del shell.
Antes de presionar Enter:
Después:
Captura de pantalla del Monitor de proceso:
- Intentar ejecutar el comando como proceso en segundo plano:
cmd /c mklink &
aparentemente funciona: elmklink
comando se ejecuta, pero elCMD
shell no finaliza. Cada vez queEnter
se presiona,CMD
se convertirá en el caparazón activo.
Respuesta1
Busque en %PATH% cmd.cmd o cmd.bat. Pueden interferir con tu cmd.
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
msys
se convertirá/c
ac:\
; 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 mklink
se quejó de que /msys64
no 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=NEW
sintaxis 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
msys
se convertirá/c
ac:\
; 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 /c
conversió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_EXCL
puede ser*
excluir todo o una lista de uno o más prefijos de argumentos separados por;
, comoMSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test
[...]