WindowsCMD
实用程序有许多内部命令,例如mklink
。如何从 shell 中使用它们msys
?
从CMD
的文档,该/c
开关可用于执行命令并退出;但这似乎不起作用。
- 如果我这样做,
cmd /c mklink
命令mklink
就不会执行,并且CMD
shell 也不会退出。
按 Enter 键之前:
后:
进程监视器截图:
- 尝试将命令作为后台进程运行:
cmd /c mklink &
显然可行 -mklink
命令已执行,但CMD
shell 未终止。每次Enter
按下 ,CMD
都将成为活动 shell。
答案1
在 %PATH% 中搜索 cmd.cmd 或 cmd.bat。它们可能会干扰你的 cmd
跑步进程监控并运行
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
我无法让它工作基于Mihai 的评论单独,因为路径/
中仍然包含正斜杠,并且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${PARAM:/OLD/NEW}
对于熟悉 bash 的人来说,这类似于 bash 的语法
答案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
[...]