2013-01-06 12 views
15

trzeba uruchomićUżyj spacji w skrypcie bat, bez cudzysłowów

start cmd.exe /k "C:\Program Files (x86)\Mozilla Firefox\sdk\bin\activate & cd d:\home\name\addon\ & cfx run" 

Problem polega na tym, że pierwsza ścieżka zawiera spacje (Program Files). Nie mogę używać cudzysłowów, ponieważ są one już używane do pełnego polecenia.

Jak mogę użyć spacji w tym poleceniu?

+0

Co oznacza singiel i czy? – Bill

+1

Jest to separator poleceń cmd. – Qiao

+0

jeśli nie możesz osobno zakwestionować każdego z nich? na przykład uruchom cmd.exe/k "command 1" i "command 2", to może powinieneś umieścić te polecenia w osobnym pliku .bat i po prostu go uruchomić. – Bill

Odpowiedz

15

Kto powiedział, że nie można dodawać cudzysłowów na ścieżce exe, gdy polecenie/C jest już cytowane? To działa dobrze ! :-)

start cmd.exe /k ""C:\Program Files (x86)\Mozilla Firefox\sdk\bin\activate" & cd d:\home\name\addon\ & cfx run" 

Zewnętrzne cudzysłowie komendy/C są usuwane przed wykonaniem, pozostawiając tylko cudzysłowy wokół ścieżki exe. Możesz przeczytać o sposobie wyceny procesów CMD w pomocy. Po prostu wpisz CMD /? lub HELP CMD z wiersza polecenia. To staje się mylące.

If /C or /K is specified, then the remainder of the command line after 
the switch is processed as a command line, where the following logic is 
used to process quote (") characters: 

    1. If all of the following conditions are met, then quote characters 
     on the command line are preserved: 

     - no /S switch 
     - exactly two quote characters 
     - no special characters between the two quote characters, 
      where special is one of: &<>()@^| 
     - there are one or more whitespace characters between the 
      two quote characters 
     - the string between the two quote characters is the name 
      of an executable file. 

    2. Otherwise, old behavior is to see if the first character is 
     a quote character and if so, strip the leading character and 
     remove the last quote character on the command line, preserving 
     any text after the last quote character. 

Twoje polecenie ma więcej niż 2 cudzysłowy, więc opcja 2 jest przestrzegana.

Jednorazowy powyższy kod nie zadziała, jeśli Twoja nazwa exe zawiera znak specjalny, taki jak &, na przykład this&that.exe. Powoduje to problem, ponieważ nazwa exe nie jest cytowana, gdy polecenie START jest początkowo analizowane. Można to naprawić, wymykając się znakowi problemu w nazwie pliku.

start cmd.exe /k ""this^&that.exe" & echo something else" 
+1

Nawet tego nie przetestowałem, myślałem, że w 100% zepsuje wszystko – Qiao

4

Można spróbować ze starym stylu DOS-pisania, gdzie każda ścieżka-segment ma maksymalne 8 znaków takich jak:

C:\Progra~1\Mozill~1\ 

katalogu ~ 1 jest od kolejności alfabetycznej:

C:\DisIsMyDirAlpha 
C:\DisIsMyDirBeta 
C:\DisIsMyDirGamma 

są te:

C:\DisIsM~1 
C:\DisIsM~2 
C:\DisIsM~3 
+1

To nie zadziała, jeśli na woluminie NTFS z wyłączonymi krótkimi nazwami 8.3. Istnieje prostsze rozwiązanie, które zawsze działa: Zobacz [moja odpowiedź] (http://stackoverflow.com/a/14184116/1012053) – dbenham

0

Stosować cytaty na pierwszej ścieżce i uciec im ^:

start cmd.exe /k "^"C:\Program Files (x86)\Mozilla Firefox\sdk\bin\activate^" & cd d:\home\name\addon\ & cfx run" 

EDIT:

Odnośnie komentarza @dbenham „s:
Interesujące. Ucieczka z ^ przydała mi się, chociaż moje rzeczywiste polecenie było nieco inne, ponieważ testowałem je przy pierwszym poleceniu, które przyszło mi do głowy.

To działa na moim komputerze (Windows XP SP 3):

start cmd.exe /k "xcopy ^"C:\Program Files\Windows Live\Messenger\license.rtf^" c:\" 

Czytałem również o ucieczce za pomocą cudzysłowów "", ale to nie działa dla mnie z moim powyższym przykładzie.
Potem znowu nie jestem guru plików wsadowych i być może cmd.exe zachowuje się inaczej podczas korzystania z & (o czym nigdy wcześniej nie słyszałem).

+1

To NIE działa. Spróbuj! Jeśli usuniesz opiekę, tak jak to zrobiłem w [moja odpowiedź] (http://stackoverflow.com/a/14184116/1012053), to działa dobrze. – dbenham

+0

@dbenham: Może to zadziałało tylko dla mnie, ponieważ użyłem nieco innej przykładowej komendy. Dodałem trochę informacji do mojej odpowiedzi! –

+1

Twój przypadek działa, ponieważ udało Ci się uciec przed cytatami wokół opcji polecenia. Opieki są usuwane do czasu, gdy XCOPY odczytuje opcję. Działa równie dobrze bez uchwytów. Nie działa, jeśli unikniesz cudzysłowu wokół pliku wykonywalnego ze spacjami w nazwie. Analizator składni zerwie nazwę exe na pierwszym polu i zakończy się niepowodzeniem. Przyznaję, że wyciskanie partii i ucieczka mogą się skomplikować, ale ta odpowiedź wyskakuje z niewłaściwego drzewa. – dbenham

0
start cmd.exe /k "" "C:\Program Files (x86)\Mozilla Firefox\sdk\bin\activate & cd d:\home\name\addon\ & cfx run" 

Dodaj te dwa dodatkowe cytaty przed filePath. To zwykle działa dla mnie. Powodzenia :)

+0

To wyglądało dość niepewnie, więc spróbowałem i nie zadziałało. Nie jestem nawet pewien, co te dodatkowe cytaty mają osiągnąć, ale to jest jak wpisywanie '' C: \ Program Files (x86) \ Mozilla Firefox \ sdk \ bin \ activate & cd d: \ home \ name \ addon \ & cfx run' przy monicie, co oczywiście nie działa. Błąd, który dostaję na Windows 7 w obu kierunkach to: "Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest nieprawidłowa. W każdym razie odpowiedź @ dbenham jest prawidłowa. –

Powiązane problemy