2011-05-04 12:54:50 +0000 2011-05-04 12:54:50 +0000
92
92

Jak można uciec od spacji w wierszu poleceń w Windows bez użycia cudzysłowów?

Na przykład jaka jest alternatywa dla tej komendy bez cudzysłowów:

CD "c:\Documents and Settings"

Pełnym powodem, dla którego nie chcę używać cudzysłowów jest to, że ta komenda NIE działa:

SVN add mypathname\*.*

ale ta komenda NIE działa :

SVN add "mypathname\*.*"

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

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

Ale kiedy tego spróbuję, otrzymam następujący komunikat o błędzie:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

Odpowiedzi (7)

59
59
59
2011-05-04 16:59:54 +0000

It almost all works for me, but have you perhaps tried line5… escapeing the space with a caret symbol (^)

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:\>

Or e.g. below where the caret really makes all the difference.

Looks from below like the caret symbol may be your answer, see line 3 below.

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:\>
36
36
36
2013-04-24 07:45:18 +0000

Stwierdziłem, że umieszczanie cytatów wokół tylko jednej części lokalizacji działa. W twoim przypadku:

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

Chociaż używa się w tym przypadku cudzysłowów, ważną rzeczą do zauważenia jest to, że gwiazdki są _ poza_ cudzysłowami, więc nadal działają poprawnie.

26
26
26
2015-08-26 02:01:44 +0000

Pomimo odpowiedzi dających złudzenie, że to działa, faktem jest, że nie można wkradać się w przestrzenie do zwykłych argumentów cmd. To jest łatwe do udowodnienia:

  1. Zapisz “echo %1” jako test.bat. Ten plik wsadowy wyświetli pierwszy argument, który cmd nam przekaże.

  2. Teraz spróbuj uruchomić test.bat, ustawiając wartość %1 na foo bar. (Zauważ, że pomiędzy foo a bar znajduje się znak spacji)

  3. Próba i błąd przez kilka lat i zdaj sobie sprawę, że nie da się tego zrobić. Folks will suggest to escape using ^, yet test.bat foo^ bar will not output foo bar.

So, there’s no way to get the output foo bar, and the closest we can get is running test.bat foo" "bar which produces foo" "bar, or running test.bat "foo bar" which produces "foo bar".


Powodem, dla którego pozostałe odpowiedzi pojawiają się do pracy jest to, że cd robi własne dodatkowe parsowanie, odbiegające od zachowania zwykłego przekazywania argumentów (zwykłe %1, %2, %3 i inne w typowych plikach wsadowych).

Na przykład, weź pod uwagę osobliwe polecenie:

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

Dlaczego to działa? Jest to spowodowane tym, że cd self robi coś, co jest odpowiednikiem łączenia 7 usual argumentów w jeden logiczny. Zgodnie z normami przekazywania argumentów cmd widzimy 7 argumentów:

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

It’s like though cd has joined all the 7 arguments into one logical one, doing something like to array.join(" "), which produces the path:

c:\documents and settings \some folder with spaces

Note that this behaviour is peculiar to cd only (and some other functions). Nie ma to nic wspólnego ze zwykłym przekazywaniem argumentów.

  • *

Rzeczywiście, cd ma jeszcze jedną osobliwość. Pamiętasz, jak wyżej stwierdziliśmy, że nie mogliśmy uzyskać wyjścia foo bar? Najbliższe wyjście, jakie możemy uzyskać, to:

test.bat foo" "bar

, który produkuje foo" "bar, lub:

test.bat "foo bar"

, który produkuje "foo bar", lub:

test.bat "foo "bar

, który produkuje "foo "bar, lub:

test.bat foo" bar"

, który produkuje foo" bar", lub:

test.bat "foo b"ar

, który produkuje "foo b"ar, lub:

test.bat fo"o bar"

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

test.bat fo"o ba"r

który produkuje fo"o ba"r, lub:

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", lub:

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

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

Wszystkie powyższe przykłady mają jedno podobieństwo, które polega na tym, że wytworzą foo bar po obcięciu znaków ". cd autor musiał zdać sobie z tego sprawę… gdybyśmy mieli wywnioskować z osobliwego zachowania cd, które odcina wszystkie ", które otrzymuje , pozwalając wszystkim tym komendom działać:

  • 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

8
8
8
2014-04-19 07:51:15 +0000

Skrócona nazwa działa jak bryza.

“E:\Program~1\Java\Eclipse\eclipse.exe” -vmargs -Xms1024m -Xmx2048m

Dla zwiększenia pamięci… ;)

3
3
3
2012-10-03 14:47:56 +0000

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

If exist c:\docume~1 goto :Ifoundthesucker
2
2
2
2017-05-12 08:43:24 +0000

Dla tych, którzy mówią o zamianie 8.3, proszę zwrócić uwagę na następujące dwie rzeczy:

  • 8.3 może być ustawiony na wyłączony (lub włączony) na NTFS, więc może nie zawsze istnieć.
  • Nazwa 8.3 pliku/folderu może zmienić się bez powiadomienia tylko poprzez utworzenie, zmianę nazwy lub usunięcie innych rzeczy w tym samym folderze.

  • Folder, który chcesz

  • Inny folder

  • Folder zmienny w czasie

  • Nie jest bezpieczny, chyba że otrzymasz krótką nazwę i użyjesz jej w operacjach atomowych.

Jeśli chcesz wiedzieć, czy 8.3 istnieje dla konkretnego folderu/pliku, przetestuj go z parametrem c:\docume~1 na komendzie /X lub zamknij go w dir, aby uzyskać tylko tę część, itp: https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

0
0
0
2019-08-08 20:42:46 +0000

Kontynuując post @Pang, oraz inne osoby omawiające krótkie nazwy i pułapki, oto sposób na dynamiczne rozwiązanie długiej nazwy do nazwy krótkiej:

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

Następnie, oczywiście można użyć nazwy krótkiej, a nie otaczających ją cudzysłowów.