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

Как избежать пробелов в командной строке Windows без использования кавычек?

Например, что является альтернативой этой команде без кавычек:

CD "c:\Documents and Settings"

Полная причина, по которой я не хочу использовать кавычки, заключается в том, что эта команда DOES работает:

SVN add mypathname\*.*

, но эта команда НЕ работает :

SVN add "mypathname\*.*"

Проблема в том, что когда я меняю mypathname для пути с пробелами в нем, мне нужно процитировать его целиком. Например:

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

Но когда я пытаюсь это сделать, я получаю следующее сообщение об ошибке:

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

Ответы (7)

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

Почти всё это работает для меня, но, возможно, вы пробовали сделать строку5… выходя из пространства с символом каретты (^)

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

Или, например, внизу, где каретта действительно имеет значение.

выглядит снизу, как будто символ каретты может быть вашим ответом, смотрите строку 3 ниже.

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

Я обнаружил, что размещение цитат вокруг только одной части местоположения работает. В вашем случае:

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

Хотя в этом случае используются кавычки, важно заметить, что звездочки - это outside кавычки, поэтому они все равно функционируют правильно.

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

Несмотря на ответы, создающие иллюзию, что это работает, факт в том, что вы не можете прокрасться в пространство в обычные аргументы в формате cmd. Это легко доказать:

  1. Сохраните “echo %1” как test.bat. Этот пакетный файл выдаст первый аргумент, который нам передаст команда.

  2. Теперь попробуйте запустить test.bat, установив значение %1 в foo bar. (Обратите внимание, что между foo и bar есть пробел.)

  3. Пробейте несколько лет и поймите, что это невозможно**. Люди будут предлагать отказаться от использования ^, но test.bat foo^ bar не будет выводить foo bar.

Таким образом, нет никакого способа получить выход foo bar, и ближе всего мы можем получить, это запустить test.bat foo" "bar, которая производит foo" "bar, или запустить test.bat "foo bar", которая производит "foo bar".

  • *

Причина, по которой другие ответы кажутся работающими, заключается в том, что cd делает свой собственный дополнительный разбор, отличающийся от поведения обычной передачи аргументов (обычные %1, %2, %3 и т.д. в типичных пакетных файлах).

Например, рассмотрим особенную команду:

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

Почему она работает? Это связано с тем, что cd itself делает нечто эквивалентное объединению 7 usual аргументов в один логический. Согласно нормам передачи аргументов cmd, мы видим 7 аргументов:

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

Как будто array.join(" ") объединил все 7 аргументов в один логический, делая что-то похожее на cd, что порождает путь:

c:\documents and settings \some folder with spaces

Заметьте, что это поведение специфично только для cd (и некоторых других функций). Оно не имеет ничего общего с обычной передачей аргументов.

  • *

Действительно, foo bar имеет еще одну особенность. Помните, мы говорили выше, что не можем получить результат foo" "bar? Ближайший результат мы можем получить, запустив:

test.bat foo" "bar

, который производит "foo bar", или:

test.bat "foo bar"

, который производит "foo "bar, или:

test.bat "foo "bar

, который производит foo" bar", или:

test.bat foo" bar"

, который производит "foo b"ar, или:

, который производит fo"o bar", или:

test.bat "foo b"ar

fo"o ba"r, или:

"fo"o" bar", или:

"f""o""o"" ""b""a""r", или:

test.bat fo"o bar"

""""f"""o""""o"" ""ba"""r"""""""""", или:

test.bat fo"o ba"r

, или: foo bar.

Все вышеприведенные примеры имеют одно сходство, то есть они будут производить " после того, как мы обрезаем cd chars. Автор cd, должно быть, понял это тоже…. если мы будем делать вывод об особом поведении ", которое отсекает все 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

  • &007

  • &007

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

Короткое имя работает как ветер.

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

For boosting the memory up… ;)

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

Используйте короткое имя 8.3. Например:

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

Для тех, кто говорит о замене 8.3, обратите внимание на следующие две вещи:

  • 8.3 может быть отключено (или включено) на NTFS, так что он не всегда может существовать.
  • Имя файла/папки 8.3 может быть изменено без уведомления, просто создав, переименовав или удалив другие вещи в той же папке.

So c:\docume~1 может указывать на:

  • Нигде (быть недействительным)
  • Папка, которую вы хотите
  • Другая папка
  • Переменная папка по времени

Это не безопасно, если вы не получите короткое имя и не будете использовать его в атомарных операциях.

Хотя очень редко они меняются, обычно их не существует.

Если вы хотите знать, существует ли 8.3 для определенной папки/файла, протестируйте ее с помощью параметра /X в команде dir, или инкапсулируйте ее в for, чтобы получить только эту часть, и т.д.

Подробнее о том, как включить/выключить 8.3 в NTFS, смотрите эту статью о поддержке Microsoft: 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

F

Похожие вопросы

3
19
10
28
7