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