The Computer Oracle

How to run internal cmd command from the msys shell?

--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------

Music by Eric Matyas
https://www.soundimage.org
Track title: Peaceful Mind

--

Chapters
00:00 How To Run Internal Cmd Command From The Msys Shell?
00:51 Accepted Answer Score 16
01:10 Answer 2 Score 3
01:44 Answer 3 Score 2
02:46 Answer 4 Score 1
03:42 Thank you

--

Full question
https://superuser.com/questions/526736/h...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#commandline #msysgit #msys

#avk47



ACCEPTED ANSWER

Score 16


  1. Search your %PATH% for cmd.cmd or cmd.bat. They may interfere with your cmd

  2. 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 to c:\ ; 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 to c:\ ; 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 ;, like MSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test [...]