How to run internal cmd command from the msys shell?
Become or hire the top 3% of the developers on Toptal https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Techno Bleepage Open
--
Chapters
00:00 Question
01:23 Accepted answer (Score 16)
01:49 Answer 2 (Score 3)
02:34 Answer 3 (Score 2)
03:52 Answer 4 (Score 1)
05:14 Thank you
--
Full question
https://superuser.com/questions/526736/h...
Question links:
[CMD]: http://www.microsoft.com/resources/docum...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#commandline #msysgit #msys
#avk47
ACCEPTED ANSWER
Score 16
Search your %PATH% for cmd.cmd or cmd.bat. They may interfere with your cmd
Run Process Monitor and run your
cmd /c mklink
. Examine ProcMon log for really executed commands.
ANSWER 2
Score 3
win7/cygwin/bash had same problem, solution is to launch cmd twice,
and convert slashes to backslashes as needed by cmd (for example):
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
ANSWER 3
Score 2
Process Monitor helped track down the issue. It is that
msys
will convert/c
toc:\
; it needs to be escaped:cmd //c mklink
. The way these conversions are done is explained here. – Mihai Rotaru Jan 1 '13 at 21:32
I could not get this to work based on Mihai's comment alone, because the path still contained forward slashes /
in it, and mklink
complained that /msys64
was not a valid switch.
So I wrote a batch script to get it working.
Here's how I call my batch script from MSYS:
$ mingw_ln.bat "$destination" "$targetpath"
And, the batch script takes those two paths, and converts /
to \
, using the :OLD=NEW
parameter expansion syntax for string replacements.1
set LINK=%1
set TARGET=%2
REM Convert POSIX paths to Windows paths
set LINK=%LINK:/=\%
set TARGET=%TARGET:/=\%
mklink /D %LINK% %TARGET%
1 This is similar to bash's ${PARAM:/OLD/NEW}
syntax, for those familiar with it
ANSWER 4
Score 1
Expanding on Mihai Rotaru's comment:
Process Monitor helped track down the issue. It is that
msys
will convert/c
toc:\
; it needs to be escaped:cmd //c mklink
. The way these conversions are done is explained here. – Mihai Rotaru Jan 1 '13 at 21:32
This /c
to c:\
conversion can also be avoided for some or all arguments by using the environment variable MSYS2_ARG_CONV_EXCL
.
E.g.
$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"
(Careful since '*'
and "*"
will mean different things.)
Citing the MSYS2 docs:
MSYS2_ARG_CONV_EXCL
can either be*
to mean exclude everything, or a list of one or more arguments prefixes separated by;
, likeMSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test
[...]