Jak uruchomić wewnętrzne polecenie cmd z powłoki msys?

18

Narzędzie Windows CMDma wiele wewnętrznych poleceń, takich jak mklink. Jak można ich używać z msyspowłoki?

Z CMD„s dokumentacji The /cprzełącznik może być użyty do wykonania polecenia i wyjście; ale to nie działa.

  • Jeśli robię polecenie nie zostanie wykonane, a powłoka nie jest zakończony.cmd /c mklinkmklinkCMD

Przed naciśnięciem Enter:

wprowadź opis zdjęcia tutaj

Po:

wprowadź opis zdjęcia tutaj

Zrzut ekranu Monitora procesu:

wprowadź opis zdjęcia tutaj

  • Próba uruchomienia polecenia jako procesu w tle: cmd /c mklink &najwyraźniej działa - mklinkpolecenie jest wykonywane, ale CMDpowłoka nie jest zakończona. Po każdym Enternaciśnięciu CMDstanie się aktywną powłoką.
Mihai Rotaru
źródło
cmd /c mklinkdziała dla mnie z moją powłoką C, z Cygwin bashi cmd.exe. Ale musiałem biegać na podwyższeniu, bo w przeciwnym razie dostałem skargi: „Nie masz wystarczających uprawnień, aby wykonać tę operację”. Nie próbowałem, msysponieważ nie mam go zainstalowanego, ale jestem sceptyczny, to jest problem. Podejrzewam, że dzieje się coś jeszcze. Pomocny może być zapis lub zrzut ekranu z tego, co zrobiłeś i co się stało.
Nicole Hamilton,
@NicoleHamilton, dodane zrzuty ekranu. Aby mklinkdziałać, powłoka musi być uruchomiona jako administrator; ale moim problemem jest to, że nie mogę uruchomić żadnego z wewnętrznych poleceń bez cmdprzejęcia przez powłokę lub uruchomienia w tle. Ten problem występuje również w przypadku prostszych poleceń, które nie wymagają administratora, takich jak dir.
Mihai Rotaru
Czy masz alias, definicję procedury lub skrypt, który może przechwytywać cmd?
Nicole Hamilton,
@NicoleHamilton, nie; Skorzystałem z porady @Maxiums i uruchomiłem Monitor Monitora, i jak widać na załączonym zrzucie ekranu, problem polega na tym, że msyskonwertuje się /cna c:\ . Odpowiedzią jest ucieczka i uruchomienie polecenia jako cmd //c mklink.
Mihai Rotaru

Odpowiedzi:

13
  1. Wyszukaj% PATH% w poszukiwaniu cmd.cmd lub cmd.bat. Mogą zakłócać twoje cmd

  2. Uruchom Monitor procesu i uruchom swój cmd /c mklink. Sprawdź dziennik ProcMon pod kątem naprawdę wykonanych poleceń.

Maximus
źródło
25
Monitor procesu pomógł wyśledzić problem. To, że msysprzekształci /csię c:\ ; to musi być uciekł: cmd //c mklink. Sposób konwersji jest wyjaśniony tutaj .
Mihai Rotaru
1
@MihaiRotaru ten komentarz powinien być odpowiedzią
laktak
2

win7 / cygwin / bash miał ten sam problem, rozwiązaniem jest dwukrotne uruchomienie cmd i konwersja ukośników na odwrotne ukośniki zgodnie z potrzebami cmd (na przykład): 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

mosh
źródło
1

Monitor procesu pomógł wyśledzić problem. To, że msysprzekształci /csię c:\; to musi być uciekł: cmd //c mklink. Sposób konwersji jest wyjaśniony tutaj . - Mihai Rotaru 1 stycznia 2013 o 21:32

Nie mogłem tego uruchomić na podstawie samego komentarza Mihai , ponieważ ścieżka nadal zawierała ukośniki do przodu /i mklinknarzekała, że /msys64nie był to prawidłowy przełącznik.

Więc napisałem skrypt wsadowy, aby działał.

Oto jak nazywam mój skrypt wsadowy z MSYS:

 $ mingw_ln.bat "$destination" "$targetpath"

I skrypt wsadowy pobiera te dwie ścieżki i konwertuje /je \, używając :OLD=NEWskładni rozszerzania parametrów do zamiany łańcucha. 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 Jest to podobne do ${PARAM:/OLD/NEW}składni basha dla tych, którzy go znają

jpaugh
źródło