Como executar o comando cmd interno do shell msys?

17

As janelas CMD utilitário tem um número de comandos internos, como mklink. Como eles podem ser usados ​​a partir do msys Concha ?

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

  • Se eu fizer cmd /c mklink a mklink comando não é executado e o CMD shell não é encerrado.

Antes de pressionar Enter:

enter image description here

Depois de:

enter image description here

Captura de tela do Process Monitor:

enter image description here

  • Tentando executar o comando como um processo em segundo plano: cmd /c mklink & aparentemente funciona - o mklink comando é executado, mas o CMD shell não está terminado. Toda vez Enter é pressionado CMD vai se tornar o shell ativo.
Mihai Rotaru
fonte
cmd /c mklink funciona para mim com minha shell C, com Cygwin bash e com cmd.exe. Mas eu tenho que estar correndo em alta ou então eu tenho queixas, "Você não tem privilégio suficiente para realizar esta operação." Eu não tentei msys porque eu não tenho instalado, mas sou cético que é o problema. Eu suspeito que há algo mais acontecendo. Uma transcrição ou uma captura de tela do que você fez e o que aconteceu pode ser útil.
Nicole Hamilton
@NicoleHamilton, screenshots adicionados. Para mklink para funcionar, o shell precisa ser executado como administrador; mas meu problema é que eu não posso executar nenhum dos comandos internos sem o cmd shell assumindo ou executando em segundo plano. Esse problema também está presente para comandos mais simples que não requerem administração, como dir.
Mihai Rotaru
Você tem um alias, definição de procedimento ou script que pode estar interceptando? cmd?
Nicole Hamilton
@NicoleHamilton, não; Tomei o conselho do @Maxiums e executei o Process Monitor, e como pode ser visto na imagem que eu anexei, a questão é que msys converte /c para c:\ . A resposta é escapar e executar o comando como cmd //c mklink.
Mihai Rotaru

Respostas:

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

  2. Corre Monitor de processo e execute o seu cmd /c mklink. Examine o log do ProcMon para comandos realmente executados.

Maximus
fonte
24
O Process Monitor ajudou a rastrear o problema. É isso msys vai converter /c para c:\ ; precisa ser escapado: cmd //c mklink. A maneira como essas conversões são feitas é explicada Aqui .
Mihai Rotaru
1
@MihaiRotaru este comentário deve ser uma resposta
laktak
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 / mklink c / D.Repo $ REPO_DIR" # cmd lançamento / C cmd / C cmd

mosh
fonte
1

O Process Monitor ajudou a rastrear o problema. É isso msys vai converter /c para c:\ ; precisa ser escapado: cmd //c mklink. A maneira como essas conversões são feitas é explicada Aqui . - Mihai Rotaru 01 de janeiro '13 às 21:32

Eu não consegui fazer isso funcionar com base em Comentário de Mihai sozinho, porque o caminho ainda continha barras / nele e mklink reclamou que /msys64 não era um interruptor válido.

Então eu escrevi um script em lote para fazê-lo funcionar.

Aqui está como eu chamo meu script em lote do MSYS:

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

E o script em lote usa esses dois caminhos e converte / para \, usando o :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 ao bash ${PARAM:/OLD/NEW} sintaxe, para aqueles familiarizados com ele

jpaugh
fonte