WindowsCMD
實用程式有許多內部命令,例如mklink
.如何從msys
shell 中使用它們?
從CMD
的文檔,/c
開關可用於執行命令並退出;但這似乎不起作用。
- 如果我這樣做,則不會執行
cmd /c mklink
該命令,並且不會退出 shell。mklink
CMD
按 Enter 之前:
後:
進程監控截圖:
- 嘗試將命令作為後台進程運行:
cmd /c mklink &
顯然有效 -mklink
命令已執行,但CMD
shell 未終止。每Enter
按一次,CMD
就會成為活動外殼。
答案1
在 %PATH% 中搜尋 cmd.cmd 或 cmd.bat。他們可能會幹擾你的命令
跑步過程監控器並運行你的
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
Process Monitor 幫助追蹤了這個問題。它將
msys
轉換/c
為c:\
;它需要轉義:cmd //c mklink
。解釋了這些轉換的完成方式這裡。 ——米哈伊·羅塔魯2013 年 1 月 1 日 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 的評論:
Process Monitor 幫助追蹤了這個問題。它將
msys
轉換/c
為c:\
;它需要轉義:cmd //c mklink
。解釋了這些轉換的完成方式這裡。 ——米哈伊·羅塔魯2013 年 1 月 1 日 21:32
透過使用環境變量,也可以避免部分或所有參數的這種/c
轉換。c:\
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
[...]