如何从 msys shell 运行内部 cmd 命令?

如何从 msys shell 运行内部 cmd 命令?

WindowsCMD实用程序有许多内部命令,例如mklink。如何从 shell 中使用它们msys

CMD的文档,该/c开关可用于执行命令并退出;但这似乎不起作用。

  • 如果我这样做,cmd /c mklink命令mklink就不会执行,并且CMDshell 也不会退出。

按 Enter 键之前:

在此处输入图片描述

后:

在此处输入图片描述

进程监视器截图:

在此处输入图片描述

  • 尝试将命令作为后台进程运行:cmd /c mklink &显然可行 -mklink命令已执行,但CMDshell 未终止。每次Enter按下 ,CMD都将成为活动 shell。

答案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

Process Monitor 帮助追踪了这个问题。它将msys转换/cc:\;需要转义: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转换/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 [...]

相关内容