Як запустити внутрішню команду 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, nope; Я взяв поради @Maxiums і запустив Монітор процесів, і як видно на скріншоті, який я додав, проблема полягає в тому, що msysперетворюється /cв c:\ . Відповідь - уникнути цього та виконати команду як cmd //c mklink.
Михай Ротару

Відповіді:


14
  1. Шукайте% PATH% для cmd.cmd або cmd.bat. Вони можуть заважати вашому cmd

  2. Запустіть монітор процесу та запустіть свій cmd /c mklink. Вивчіть журнал ProcMon щодо дійсно виконаних команд.


26
Монітор процесів допоміг відстежити проблему. Це те 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

Монітор процесів допоміг відстежити проблему. Це те msys, що перетвориться /cна c:\; вона повинна бути екрановані: cmd //c mklink. Чином ці перетворення робляться пояснюється тут . - Михай Ротару 1 січня 1313 о 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}синтаксис Баша для тих, хто його знайомий

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.