Como executar o comando cmd interno do shell msys?

Como executar o comando cmd interno do shell msys?

O CMDutilitário do Windows possui vários comandos internos, como mklink. Como eles podem ser usados ​​a partir do msysshell?

DeCMDdocumentação, o /cswitch pode ser usado para executar um comando e sair; mas isso não parece funcionar.

  • Se eu fizer isso, cmd /c mklinko mklinkcomando não será executado e o CMDshell não será encerrado.

Antes de pressionar Enter:

insira a descrição da imagem aqui

Depois:

insira a descrição da imagem aqui

Captura de tela do Monitor de Processo:

insira a descrição da imagem aqui

  • Tentando executar o comando como um processo em segundo plano: cmd /c mklink &aparentemente funciona - o mklinkcomando é executado, mas o CMDshell não é finalizado. Cada vez que Enterfor pressionado, CMDele se tornará o shell ativo.

Responder1

  1. Pesquise em% PATH% por cmd.cmd ou cmd.bat. Eles podem interferir no seu cmd

  2. 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 msysirá converter /cpara c:\; 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 mklinkreclamou que /msys64nã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=NEWsintaxe 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 msysirá converter /cpara c:\; 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 /cconversã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_EXCLpode *significar excluir tudo ou uma lista de um ou mais prefixos de argumentos separados por ;, como MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test [...]

informação relacionada