msys 쉘에서 내부 cmd 명령을 실행하는 방법은 무엇입니까?

msys 쉘에서 내부 cmd 명령을 실행하는 방법은 무엇입니까?

Windows CMD유틸리티에는 다음과 같은 여러 내부 명령이 있습니다 mklink. 쉘 에서 어떻게 사용할 수 있습니까 msys?

에서CMD님의 문서, /c스위치를 사용하여 명령을 실행하고 종료할 수 있습니다. 하지만 이것은 작동하지 않는 것 같습니다.

  • 그렇게 하면 cmd /c mklink명령 mklink이 실행되지 않고 CMD쉘이 종료되지 않습니다.

Enter를 누르기 전:

여기에 이미지 설명을 입력하세요

후에:

여기에 이미지 설명을 입력하세요

프로세스 모니터 스크린샷:

여기에 이미지 설명을 입력하세요

  • 명령을 백그라운드 프로세스로 실행하려고 합니다. cmd /c mklink &분명히 작동합니다. mklink명령은 실행되지만 CMD쉘은 종료되지 않습니다. Enter누를 때마다 CMD활성 쉘이 됩니다.

답변1

  1. %PATH%에서 cmd.cmd 또는 cmd.bat를 검색하세요. cmd를 방해할 수 있습니다.

  2. 달리다프로세스 모니터그리고 cmd /c mklink. 실제로 실행된 명령에 대한 ProcMon 로그를 검사합니다.

답변2

win7/cygwin/bash에는 동일한 문제가 있었습니다. 해결책은 cmd를 두 번 실행하고 cmd에서 필요에 따라 슬래시를 백슬래시로 변환하는 것입니다(예:). 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

답변3

프로세스 모니터는 문제를 추적하는 데 도움이 되었습니다. 로 msys변환되는 것입니다 . 이스케이프되어야 합니다: . 이러한 변환이 수행되는 방식이 설명됩니다./cc:\cmd //c mklink여기. – 미하이 로타루13-01-01 21:32

나는 이것을 기반으로 작동시키지 못했습니다.미하이의 코멘트경로 /에 여전히 슬래시가 포함되어 있고 유효한 스위치가 아니라고 mklink불평했기 때문입니다./msys64

그래서 작동하도록 배치 스크립트를 작성했습니다.

MSYS에서 배치 스크립트를 호출하는 방법은 다음과 같습니다.

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

그리고 배치 스크립트는 문자열 대체를 위한 매개변수 확장 구문을 사용하여 이 두 경로를 사용하고 /로 변환합니다. 1\:OLD=NEW

set LINK=%1
set TARGET=%2

REM Convert POSIX paths to Windows paths
set LINK=%LINK:/=\%
set TARGET=%TARGET:/=\%

mklink /D %LINK% %TARGET%

1 이것은 bash의 ${PARAM:/OLD/NEW}구문과 유사합니다.

답변4

Mihai Rotaru의 의견을 확장하면 다음과 같습니다.

프로세스 모니터는 문제를 추적하는 데 도움이 되었습니다. 로 msys변환되는 것입니다 . 이스케이프되어야 합니다: . 이러한 변환이 수행되는 방식이 설명됩니다./cc:\cmd //c mklink여기. – 미하이 로타루13-01-01 21:32

환경 변수를 사용하면 일부 또는 모든 인수에 대해 이러한 변환 /cc:\피할 수도 있습니다 MSYS2_ARG_CONV_EXCL.

예:

$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"

(그 이후로 조심하세요. '*'그리고 "*"다른 의미를 갖게 될 것입니다.)

인용하면MSYS2 문서:

MSYS2_ARG_CONV_EXCL모든 것을 제외한다는 의미 일 수도 있고 [...] 와 같이 *로 구분된 하나 이상의 인수 접두사 목록일 수도 있습니다.;MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test

관련 정보