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


19

Windows CMD实用程序具有许多内部命令,例如mklink。如何从msys外壳中使用它们?

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

  • 如果我执行cmd /c mklinkmklink命令,则不会执行该命令,并且CMD不会退出该外壳程序。

在按Enter键之前:

在此处输入图片说明

后:

在此处输入图片说明

Process Monitor屏幕截图:

在此处输入图片说明

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

cmd /c mklink适用于我的C shell,Cygwin bashcmd.exe。但是我确实必须在高处跑步,否则我会抱怨:“您没有足够的特权执行此操作。” 我没有尝试过,msys因为我没有安装它,但是我对此表示怀疑。我怀疑还有其他事情在发生。您所做的事情和发生的事情的成绩单或屏幕截图可能会有所帮助。
妮可·汉密尔顿

@NicoleHamilton,添加了屏幕截图。为了mklink正常工作,确实需要以管理员身份运行外壳程序。但是我的问题是,如果没有cmdShell接管或在后台运行,我将无法运行任何内部命令。对于不需要admin的简单命令,也存在此问题dir
Mihai Rotaru

您是否有别名,过程定义或脚本可能正在拦截cmd
妮可·汉密尔顿

@NicoleHamilton,不;我接受了@Maxiums的建议,并运行了Process Monitor,正如我所附的屏幕截图所示,问题是msys转换/cc:\ 。答案是将其转义,然后以身份运行命令cmd //c mklink
Mihai Rotaru

Answers:


14
  1. 在%PATH%中搜索cmd.cmd或cmd.bat。它们可能会干扰您的cmd

  2. 运行Process Monitor并运行您的cmd /c mklink。检查ProcMon日志中是否真正执行过命令。


26
Process Monitor有助于跟踪问题。它将msys转换/cc:\ ; 它需要逃脱:cmd //c mklink。这些转换的完成方式在此进行说明。
Mihai Rotaru

1
@MihaiRotaru此评论应该是答案
laktak

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


1

Process Monitor有助于跟踪问题。它将msys转换/cc:\; 它需要逃脱:cmd //c mklink。这些转换的完成方式在此进行说明。– Mihai Rotaru 13年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这类似于bash的${PARAM:/OLD/NEW}语法,对于熟悉它的人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.