Como executar o comando cmd interno do shell msys?

17

O utilitário CMD do Windows possui vários comandos internos, como mklink . Como eles podem ser usados a partir do msys shell?

De documentação de CMD , a opção /c pode ser usada para executar um comando e Saída; mas isso não parece funcionar.

  • Se eu executar cmd /c mklink , o comando mklink não será executado e o CMD shell não será encerrado.

Antes de pressionar Enter:

Depois:

Captura de tela do Process Process:

  • Tentando executar o comando como um processo em segundo plano: cmd /c mklink & aparentemente funciona - o comando mklink é executado, mas o shell CMD não é finalizado. Toda vez que Enter for pressionado, CMD se tornará o shell ativo.
por Mihai Rotaru 01.01.2013 / 18:54

3 respostas

12
  1. Pesquise seu% PATH% para cmd.cmd ou cmd.bat. Eles podem interferir no seu cmd

  2. Execute Process Monitor e execute seu cmd /c mklink . Examine o log do ProcMon para comandos realmente executados.

por 01.01.2013 / 20:58
2

win7 / cygwin / bash teve o mesmo problema, a solução é lançar cmd duas vezes, e converta barras em barras invertidas conforme necessário por 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

    
por 03.04.2016 / 03:37
1

Process Monitor helped track down the issue. It is that msys will convert /c to c:\ ; it needs to be escaped: cmd //c mklink. The way these conversions are done is explained here. – Mihai Rotaru Jan 1 '13 at 21:32

Eu não consegui fazer isso funcionar com base em O comentário de Mihai sozinho, 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 que funcionasse.

Veja como eu chamo meu script em lote de MSYS:

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

E o script em lote usa esses dois caminhos e converte / para \ , usando a sintaxe de expansão do parâmetro :OLD=NEW 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 ${PARAM:/OLD/NEW} do bash, para os que estão familiarizados com ele

    
por 08.05.2018 / 18:37