Как запустить внутреннюю команду cmd из оболочки msys?
Окна CMD
Утилита имеет ряд внутренних команд, таких как mklink
, Как их можно использовать из msys
ракушка?
От CMD
Документация/c
переключатель может быть использован для выполнения команды и выхода; но это не похоже на работу.
- Если я сделаю
cmd /c mklink
mklink
команда не выполняется и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
[...]