79

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

CD "c:\Documents and Settings"

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

   SVN add mypathname\*.*

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

   SVN add "mypathname\*.*"

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

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

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

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

6 ответов6

49

Это почти все работает для меня, но вы, возможно, пробовали line5 ... выходя в пробел с символом каретки (^)

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

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

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

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

23

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

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

  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 %3 и т.д. в обычных пакетных файлов).

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

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

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

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

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

c:\documents and settings \some folder with spaces

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


Действительно, у cd есть еще одна особенность. Помните, мы говорили выше, что не можем получить вывод 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" bar" , или:

test.bat "foo b"ar

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

test.bat fo"o bar"

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

test.bat fo"o ba"r

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

test.bat "fo"o" bar"

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

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

который производит "f""o""o"" ""b""a""r" или даже:

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

который производит """"f"""o""""o"" ""ba"""r"""""""""" .

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

7

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

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

Для повышения памяти .. ;)

3

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

If exist c:\docume~1 goto :Ifoundthesucker
1

Говоря о замене 8.3, вы знаете, что это две вещи:

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

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

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

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

Сказал, что они очень редко меняются, но очень часто они не существуют.

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

Если больше о том, как включить / отключить 8.3 в NTFS, смотрите M $ web:

https://support.microsoft.com/es-es/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .