如何從 msys shell 執行內部 cmd 指令?

如何從 msys shell 執行內部 cmd 指令?

WindowsCMD實用程式有許多內部命令,例如mklink.如何從msysshell 中使用它們?

CMD的文檔/c開關可用於執行命令並退出;但這似乎不起作用。

  • 如果我這樣做,則不會執行cmd /c mklink該命令,並且不會退出 shell。mklinkCMD

按 Enter 之前:

在此輸入影像描述

後:

在此輸入影像描述

進程監控截圖:

在此輸入影像描述

  • 嘗試將命令作為後台進程運行:cmd /c mklink &顯然有效 -mklink命令已執行,但CMDshell 未終止。每Enter按一次,CMD就會成為活動外殼。

答案1

  1. 在 %PATH% 中搜尋 cmd.cmd 或 cmd.bat。他們可能會幹擾你的命令

  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

Process Monitor 幫助追蹤了這個問題。它將msys轉換/cc:\;它需要轉義: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轉換/cc:\;它需要轉義: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 [...]

相關內容