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

88

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

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
Дэвид
источник
2
Вы имели в виду, что у вас есть веская причина для того, чтобы не использовать кавычки.
Томас
Почему ключ вашей кавычки сломан? :)
slhck
3
@slhck Не волнуйся, моя клавиша Shift и клавиша № 2 в порядке! Я использую команду, которая не позволяет использовать символы подстановки, когда они появляются внутри кавычек, вот и все!
Дэвид
1
@MarkBooth и @WeltenWanderer хорошая попытка, но, к сожалению, это не работает. Во всех трех случаях я получаю сообщение «svn: Ошибка разрешается .....»
David
1
Вы пробовали старое 8.3 форматирование имени (DOCUME ~ 1)?
Джастин Пирс

Ответы:

55

Это почти все работает для меня, но вы, возможно, пробовали 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:\>
barlop
источник
Так как Subversion является инструментом программиста, он может быть подходящим для SO. вот связанный вопрос stackoverflow.com/questions/757435/… возможно, вы используете кавычки или каретку, чтобы получить его в SVN, тогда, возможно, вы используете обратную косую черту перед каждым пробелом
barlop
Вы также можете попробовать svn Cygwin, если вам интересно ... с некоторыми примерами ответов на этот вопрос и посмотреть, работают ли какие-либо из них или их варианты.
Барлоп
5
Символ каретки прямо отвечает на мой вопрос, поэтому я приму ваш ответ. К сожалению, команда SVN, похоже, не распознает это! Если я пытаюсь это сделать, я получаю это сообщение об ошибке "svn 'C:' не рабочая копия". У меня есть другой способ, но сначала нужно просто «cd» перейти в каталог, а затем выполнить команду SVN. Я даже могу объединить две команды в одну строку, используя оператор &&: cd "c: \ Documents and Settings \ username \ svn" && SVN add *. *
David
в примере с CD каретка не нужна, CD не нуждается в
пробелах
1
@ Chinggis6 интересно .. это не работает и для DIR. И copy, и dir встроены в команды ... хотя и CD тоже. Хотя copy и dir принимают имя файла в качестве параметра. Может быть стоит спросить на форуме
Dostips
35

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

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

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

Кит Джонсон
источник
7
Кроме того, если кто-то хочет быть минималистичным, он может заключать в кавычки только пробел или только символы, содержащие пробел, например, C: \> документы «cd» и «настройки» (хотя в этом примере cd не нужно экранировать пробелы)
барлоп
1
Большое спасибо. Я мог бы проголосовать 4 или 5 раз, если это возможно ..
Сайка
@Sayka Вопрос задал вопрос: «Как избежать пробелов в командной строке в Windows, не используя кавычки? »
barlop
2
@barlop Конечно, но причина отсутствия кавычек заключалась в том, что звездочка не выполняет свою работу, когда она находится внутри кавычек. Решение, которое я дал, позволяет избежать этой проблемы, потому что звездочки находятся за кавычками. Этот ответ не соответствует букве вопроса, но соответствует духу вопроса (т. Е. Работает по назначению).
Кит Джонсон
26

Несмотря на ответы, создающие иллюзию, что это работает, на самом деле вы не можете пробираться через пробелы в обычные аргументы 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, %2, %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после того, как мы урежем "символы. 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

Pacerier
источник
15
Какой беспорядок в пакетном программировании Windows ...
Klangen
Благодарю. Можем ли мы определить, использует ли CD argv[]или GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

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

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

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

Milorulez
источник
8
это может не работать, если короткое имя файла было отключено
phuclv
3

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

If exist c:\docume~1 goto :Ifoundthesucker
Эндрю ДеМерчант
источник
Смотрите комментарий Лю Вон Фука к ответу Милорулеса .
Герольд Брозер
2

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

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

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

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

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

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

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

Подробнее о том, как включить / отключить 8.3 в NTFS, см. В этой статье службы поддержки Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- создание-на-Ntfs-разбиения

Claudio
источник
0

В продолжение поста @ Pang и других, обсуждающих короткие имена и подводные камни, вот способ динамически преобразовать длинное имя в короткое имя:

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

Тогда, очевидно, вы можете использовать короткое имя, а не окружающие кавычки.

BuvinJ
источник