Jak uciec od spacji w wierszu poleceń w systemie Windows bez znaków cudzysłowu?

87

Na przykład jaka jest alternatywa dla tego polecenia bez znaków cudzysłowu:

CD "c:\Documents and Settings"

Całkowitym powodem, dla którego nie chcę używać cudzysłowów, jest to, że to polecenie DZIAŁA:

   SVN add mypathname\*.*

ale to polecenie NIE DZIAŁA:

   SVN add "mypathname\*.*"

Problem polega na tym, że kiedy zmieniam mypathname dla ścieżki ze spacjami, muszę zacytować całość. Na przykład:

SVN add "c:\Documents and Settings\username\svn\*.*"

Ale gdy próbuję, pojawia się następujący komunikat o błędzie:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
David
źródło
2
masz na myśli dobry powód, dla którego „nie” chcesz używać cudzysłowów.
Thomas
Dlaczego klucz do znaku cudzysłowu jest uszkodzony? :)
slhck
3
@slhck Nie martw się, mój klawisz Shift i klawisz 2 są w porządku! Używam polecenia, które nie wydaje się zezwalać na symbole wieloznaczne, gdy pojawiają się one w cudzysłowie, to wszystko!
David
1
@MarkBooth i @WeltenWanderer niezła próba, ale niestety to nie działa. We wszystkich 3 przypadkach pojawia się komunikat „svn: Błąd rozstrzygania przypadku .....”
David
1
Czy próbowałeś starego formatowania nazwy 8.3 (DOKUMENT ~ 1)?
Justin Pearce

Odpowiedzi:

54

Prawie wszystko działa dla mnie, ale może próbowałeś line5 .. ucieczki w przestrzeń za pomocą symbolu karetki (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

Lub np. Poniżej, gdzie znacznik naprawdę robi różnicę.

Wygląda od dołu, jakby symbol karetki mógł być twoją odpowiedzią, patrz wiersz 3 poniżej.

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>
barlop
źródło
ponieważ subversion jest narzędziem programisty, może być odpowiednie dla SO. oto pokrewne pytanie stackoverflow.com/questions/757435/... możesz użyć cudzysłowów lub karetki, aby dostać się do svn, a potem możesz użyć ukośnika odwrotnego przed każdą spacją
barlop
możesz także wypróbować svn cygwina, jeśli jesteś ciekawy ... z niektórymi przykładowymi odpowiedziami na to pytanie i zobaczyć, czy któraś z nich lub ich odmiany działają dla Ciebie.
barlop
5
Symbol karetki odpowiada bezpośrednio na moje pytanie, więc zaakceptuję twoją odpowiedź. Niestety polecenie SVN nie rozpoznaje go! Jeśli spróbuję, pojawi się komunikat o błędzie „svn„ C: ”nie jest kopią roboczą”. Mam jednak inne rozwiązanie i najpierw po prostu „cd” do katalogu, a następnie uruchom komendę SVN. Mogę nawet połączyć dwa polecenia razem w jednym wierszu, używając operatora &&: cd "c: \ Documents and Settings \ nazwa użytkownika \ svn" && SVN dodaj *. *
David
w przykładzie na CD, karetka nie jest konieczna, na CD nie trzeba
wstawiać wolnego
1
@ Chinggis6 ciekawe .. to też nie działa dla DIR. Zarówno copy, jak i dir są wbudowanymi poleceniami .. chociaż tak samo jest z CD. Chociaż copy i dir przyjmują nazwę pliku jako parametr. Może warto zapytać na forum
dostips
35

Odkryłem, że umieszczanie cudzysłowów wokół tylko jednej części lokalizacji działa. W Twoim przypadku:

SVN add C:\"Documents and Settings"\username\svn\*.*

Chociaż używa to cudzysłowów, należy zauważyć, że gwiazdki znajdują się poza znakami cudzysłowu, więc nadal działają poprawnie.

Kit Johnson
źródło
7
także jeśli ktoś chce być minimalistyczny, może cytować tylko spację lub tylko znaki zawierające spację, np. C: \> dokumenty cd i „se” (chociaż w przypadku tego przykładu cd nie trzeba uciekać spacje)
barlop
1
Wielkie dzięki. Mogłem głosować 4 lub 5 razy, jeśli to możliwe ..
Sayka
@Sayka Pytanie brzmiało: „Jak uciec od spacji w wierszu poleceń w systemie Windows bez znaków cudzysłowu?
barlop
2
@barlop Jasne, ale powodem braku znaków cudzysłowu było to, że gwiazdka nie wykonuje swojej pracy, gdy znajduje się w cudzysłowie. Rozwiązanie, które podałem, pozwala uniknąć tego problemu, ponieważ gwiazdki są poza cudzysłowami. Ta odpowiedź nie jest zgodna z literą pytania, ale jest zgodna z duchem pytania (tzn. Działa zgodnie z przeznaczeniem).
Kit Johnson
26

Pomimo odpowiedzi dających złudzenie, że to działa, faktem jest, że nie można przekraść się w przestrzeni do zwykłych argumentów cmd. Łatwo to udowodnić:

  1. Zapisz „ echo %1” jako test.bat. Ten plik wsadowy wyświetli pierwszy argument, który przekazuje nam cmd.

  2. Teraz spróbuj uruchomić test.bat, ustawiając wartość %1na foo bar. (Zwróć uwagę, że pomiędzy fooi bar) jest znak spacji .)

  3. Próba i błąd przez kilka lat i zdaj sobie sprawę, że nie ma na to sposobu . Ludzie zasugerują ucieczkę przy użyciu ^, ale test.bat foo^ barnie wyjdą foo bar.

Tak więc nie ma sposobu, aby uzyskać wynik foo bar, a najbliższe, co możemy uzyskać, to uruchomienie, test.bat foo" "barktóre produkuje foo" "barlub uruchomienie, test.bat "foo bar"które produkuje "foo bar".


Teraz powód inne odpowiedzi pojawiają się do pracy jest, bo cdma swój własny dodatkowy parsowanie, rozbieżne z zachowaniem zwykłej kłótni przechodzącej (zwykły %1, %2, %3i etc w typowych plików wsadowych).

Rozważmy na przykład osobliwe polecenie:

cd c:\documents and settings \some folder with spaces

Dlaczego to działa? Wynika to z tego, że cd sam zrobił coś równoważnego z połączeniem 7 zwykłych argumentów w jeden logiczny. Zgodnie z normami przekazującymi argument cmd, widzimy 7 argumentów:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

To tak, jakby cdpołączył wszystkie 7 argumentów w jeden logiczny, robiąc coś podobnego array.join(" "), co tworzy ścieżkę:

c:\documents and settings \some folder with spaces

Zauważ, że to zachowanie jest specyficzne cdtylko dla (i niektórych innych funkcji). Nie ma to nic wspólnego ze zwykłym przekazywaniem argumentów.


Rzeczywiście cdma inną osobliwość. Pamiętasz, jak powiedzieliśmy powyżej, że nie możemy uzyskać danych wyjściowych foo bar? Najbliższym wyjściem, jaki możemy uzyskać, jest uruchomienie:

test.bat foo" "bar

który produkuje foo" "barlub:

test.bat "foo bar"

który produkuje "foo bar"lub:

test.bat "foo "bar

który produkuje "foo "barlub:

test.bat foo" bar"

który produkuje foo" bar"lub:

test.bat "foo b"ar

który produkuje "foo b"arlub:

test.bat fo"o bar"

który produkuje fo"o bar"lub:

test.bat fo"o ba"r

który produkuje fo"o ba"rlub:

test.bat "fo"o" bar"

który produkuje "fo"o" bar"lub:

test.bat "f""o""o"" ""b""a""r":

który produkuje "f""o""o"" ""b""a""r", a nawet:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

który produkuje """"f"""o""""o"" ""ba"""r"""""""""".

Wszystkie powyższe przykłady mają jedno podobieństwo, to znaczy, że wytworzą je foo barpo odcięciu "znaków. cdautor też musiał to zrozumieć ... gdybyśmy wywnioskowali z cdosobliwego zachowania, które odcina wszystko, "co otrzymuje , pozwalając na działanie wszystkich tych poleceń:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs

Pacerier
źródło
15
Co za bałagan w programowaniu wsadowym okien ...
Klangen
Dzięki. Czy możemy ustalić, czy CD używa argv[]lub GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

Krótka nazwa pliku wydaje się działać jak wiatr.

„E: \ Progra ~ 1 \ Java \ Eclipse \ eclipse.exe” -vmargs -Xms1024m -Xmx2048m

Do zwiększenia pamięci ..;)

Milorulez
źródło
8
może nie działać, jeśli krótka nazwa pliku została wyłączona
phuclv
3

Użyj krótkiej nazwy pliku 8.3. Na przykład:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
źródło
Zobacz komentarz Lưu Vĩnh Phúc do odpowiedzi Miloruleza .
Gerold Broser,
2

Jeśli chodzi o wymianę 8.3, zwróć uwagę na dwie rzeczy:

  • 8.3 można ustawić na wyłączone (lub włączone) w NTFS, więc nie zawsze może istnieć.
  • Nazwa pliku / folderu 8.3 może zostać zmieniona bez uprzedzenia, po prostu tworząc, zmieniając nazwę lub usuwając inne rzeczy w tym samym folderze.

c:\docume~1Może więc wskazywać na:

  • Nigdzie (bądź nieprawidłowy)
  • Folder, który chcesz
  • Kolejny folder
  • Zmienny folder wzdłuż czasu

To nie jest bezpieczne, chyba że otrzymasz krótką nazwę i użyjesz jej w operacjach atomowych.

Chociaż zmieniają się bardzo rzadko, często nie istnieją.

Jeśli chcesz wiedzieć, czy dla określonego folderu / pliku istnieje 8.3, przetestuj go za pomocą parametru /Xw dirpoleceniu lub obuduj go, foraby uzyskać tylko tę część itp.

Więcej informacji na temat włączania / wyłączania 8.3 w systemie plików NTFS można znaleźć w tym artykule pomocy technicznej Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-nazwa-pliku- Tworzenie partycji NTFS

Claudio
źródło
0

W ślad za postem @ Panga i innymi dyskutującymi o krótkich nazwiskach i pułapkach, oto sposób na dynamiczne rozwiązanie długiej nazwy na krótką nazwę:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Wtedy oczywiście możesz użyć krótkiej nazwy zamiast otaczających ją cudzysłowów.

BuvinJ
źródło