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

19

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

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

  • Если я команда не выполняется и оболочка не вышло.cmd /c mklinkmklinkCMD

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

введите описание изображения здесь

После:

введите описание изображения здесь

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

введите описание изображения здесь

  • Попытка выполнить команду как фоновый процесс: по- cmd /c mklink &видимому, работает - mklinkкоманда выполняется, но CMDоболочка не завершена. Каждый раз, когда Enterнажата, CMDстанет активной оболочки.
Михай Ротару
источник
cmd /c mklinkработает для меня с моей оболочкой C, с Cygwin bashи с cmd.exe. Но я должен был работать с повышенными правами, иначе я получил жалобы: «У вас недостаточно прав для выполнения этой операции». Я не пробовал, msysпотому что у меня не установлено, но я скептически отношусь к этой проблеме. Я подозреваю, что происходит что-то еще. Может быть полезна расшифровка или скриншот того, что вы сделали и что случилось.
Николь Гамильтон
@NicoleHamilton, скриншоты добавлены. Чтобы mklinkработать, оболочка действительно должна быть запущена от имени администратора; но моя проблема в том, что я не могу выполнить ни одну из внутренних команд без того, чтобы cmdоболочка не перешла в режим фоновой обработки. Эта проблема также присутствует для более простых команд, которые не требуют администратора, таких как dir.
Михай Ротару
У вас есть псевдоним, определение процедуры или сценарий, который может перехватывать cmd?
Николь Гамильтон
@NicoleHamilton, нет; Я воспользовался советом @Maxiums и запустил Process Monitor, и, как видно на скриншоте, который я прикрепил, проблема в том, что msysконвертировать /cв c:\ . Ответ состоит в том, чтобы избежать этого, и выполнить команду как cmd //c mklink.
Михай Ротару

Ответы:

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

  2. Запустите Process Monitor и запустите свой cmd /c mklink. Изучите журнал ProcMon для действительно выполненных команд.

Maximus
источник
26
Process Monitor помог отследить проблему. Это то, msysчто преобразуется /cв c:\ ; это должно быть экранировано cmd //c mklink. Способ, которым эти преобразования сделаны, объяснен здесь .
Михай Ротару
1
@MihaiRotaru этот комментарий должен быть ответом
laktak
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

мош
источник
1

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 Это похоже на ${PARAM:/OLD/NEW}синтаксис bash для тех, кто с ним знаком

jpaugh
источник