Как запустить внутреннюю команду cmd из оболочки msys?

Окна CMD Утилита имеет ряд внутренних команд, таких как mklink, Как их можно использовать из msys ракушка?

От CMD Документация/c переключатель может быть использован для выполнения команды и выхода; но это не похоже на работу.

  • Если я сделаю cmd /c mklink mklink команда не выполняется и CMD оболочка не выходила.

Перед нажатием Enter:

введите описание здесь

После:

введите описание здесь

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

введите описание здесь

  • Попытка выполнить команду как фоновый процесс: cmd /c mklink & видимо работает - mklink команда выполнена, но CMD оболочка не заканчивается. Каждый раз Enter нажата, CMD станет активной оболочкой.

4 ответа

Решение
  1. Найдите в%PATH% cmd.cmd или cmd.bat. Они могут мешать вашему cmd

  2. Запустите 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[...]

Другие вопросы по тегам