O CMD
utilitário do Windows possui vários comandos internos, como mklink
. Como eles podem ser usados a partir do msys
shell?
DeCMD
documentação, o /c
switch pode ser usado para executar um comando e sair; mas isso não parece funcionar.
- Se eu fizer isso,
cmd /c mklink
omklink
comando não será executado e oCMD
shell não será encerrado.
Antes de pressionar Enter:
Depois:
Captura de tela do Monitor de Processo:
- Tentando executar o comando como um processo em segundo plano:
cmd /c mklink &
aparentemente funciona - omklink
comando é executado, mas oCMD
shell não é finalizado. Cada vez queEnter
for pressionado,CMD
ele se tornará o shell ativo.
Responder1
Pesquise em% PATH% por cmd.cmd ou cmd.bat. Eles podem interferir no seu cmd
CorrerMonitor de Processoe execute seu
cmd /c mklink
. Examine o log do ProcMon para comandos realmente executados.
Responder2
win7/cygwin/bash teve o mesmo problema, a solução é iniciar o cmd duas vezes e converter barras em barras invertidas conforme necessário pelo cmd (por exemplo):
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
Responder3
O Process Monitor ajudou a rastrear o problema. É que
msys
irá converter/c
parac:\
; ele precisa ser escapado:cmd //c mklink
. A forma como essas conversões são feitas é explicadaaqui. -Mihai Rotaru1º de janeiro de 2013 às 21:32
Não consegui fazer isso funcionar com base emComentário de Mihaisozinho, porque o caminho ainda continha barras /
e mklink
reclamou que /msys64
não era uma opção válida.
Então escrevi um script em lote para fazê-lo funcionar.
Veja como chamo meu script em lote do MSYS:
$ mingw_ln.bat "$destination" "$targetpath"
E o script em lote segue esses dois caminhos e converte /
em \
, usando a :OLD=NEW
sintaxe de expansão de parâmetro para substituições de string. 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 Isso é semelhante à sintaxe do bash ${PARAM:/OLD/NEW}
, para quem está familiarizado com ela
Responder4
Expandindo o comentário de Mihai Rotaru:
O Process Monitor ajudou a rastrear o problema. É que
msys
irá converter/c
parac:\
; ele precisa ser escapado:cmd //c mklink
. A forma como essas conversões são feitas é explicadaaqui. -Mihai Rotaru1º de janeiro de 2013 às 21:32
Esta /c
conversão c:\
também pode ser evitada para alguns ou todos os argumentos usando a variável de ambiente MSYS2_ARG_CONV_EXCL
.
Por exemplo
$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"
(Cuidado desde então '*'
e "*"
significará coisas diferentes.)
Citando oDocumentos MSYS2:
MSYS2_ARG_CONV_EXCL
pode*
significar excluir tudo ou uma lista de um ou mais prefixos de argumentos separados por;
, comoMSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test
[...]