Как запустить внутреннюю команду cmd из оболочки msys?
Окна CMD Утилита имеет ряд внутренних команд, таких как mklink, Как их можно использовать из msys ракушка?
От CMD Документация/c переключатель может быть использован для выполнения команды и выхода; но это не похоже на работу.
- Если я сделаю
cmd /c mklinkmklinkкоманда не выполняется иCMDоболочка не выходила.
Перед нажатием Enter:

После:

Скриншот монитора процесса:

- Попытка выполнить команду как фоновый процесс:
cmd /c mklink &видимо работает -mklinkкоманда выполнена, ноCMDоболочка не заканчивается. Каждый разEnterнажата,CMDстанет активной оболочкой.
4 ответа
Найдите в%PATH% cmd.cmd или cmd.bat. Они могут мешать вашему cmd
Запустите Process Monitor и запустите
cmd /c mklink, Изучите журнал ProcMon для действительно выполненных команд.
В 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
Process Monitor помог отследить проблему. Это то, что
msysпреобразует/cвc:\; это должно быть экранировано:cmd //c mklink, Способ, которым эти преобразования сделаны, объяснен здесь. - Михай Ротару 1 января '13 в 21:32
Я не мог заставить это работать на основе одного комментария Михая, потому что путь все еще содержал косые черты / в этом и mklink жаловался что /msys64 не был действительным переключателем.
Поэтому я написал пакетный скрипт, чтобы он заработал.
Вот как я называю свой пакетный скрипт из MSYS:
$ mingw_ln.bat "$destination" "$targetpath"
И пакетный скрипт принимает эти два пути, и преобразует / в \, с использованием :OLD=NEW синтаксис раскрытия параметров для замены строк.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 Это похоже на Bash's ${PARAM:/OLD/NEW} синтаксис, для тех, кто знаком с ним
Расширяя комментарий Михая Ротару:
Process Monitor помог отследить проблему. Это то, что
msysпреобразуется в ; его нужно избежать:cmd //c mklink. Здесь объясняется, как выполняются эти преобразования . — Михай Ротару
Этот/cкc:\преобразования также можно избежать для некоторых или всех аргументов, используя переменную среды.
Например
$ MSYS2_ARG_CONV_EXCL='*' /c/Windows/System32/cmd.exe /C "echo foo"
(Осторожно, так как'*'и"*"будет означать разные вещи.)
Ссылаясь на документы MSYS2 :
MSYS2_ARG_CONV_EXCLможет быть либо*означает исключить все, или список из одного или нескольких префиксов аргументов, разделенных;, нравитьсяMSYS2_ARG_CONV_EXCL=--dir=;--bla=;/test[...]