Як уникнути пробілів у командному рядку в Windows без використання лапок?


87

Наприклад, яка альтернатива цій команді без лапок:

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 Не хвилюйся, моя клавіша зсуву та клавіша номер 2 абсолютно нормально! Я використовую команду, яка, здається, не дозволяє дозволити, коли вони з’являються всередині лапок, це все!
Девід

1
@MarkBooth та @WeltenWanderer приємно спробувати, але, на жаль, це не працює. У всіх 3 випадках я отримую "svn: Помилка вирішення справи ....."
Девід

1
Ви спробували старе форматування імені 8.3 (DOCUME ~ 1)?
Джастін Пірс

Відповіді:


54

Це майже все працює для мене, але ви, можливо, ви спробували 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:\>

оскільки субверсія є інструментом програміста, вона може бути доречною для SO. ось пов’язане запитання stackoverflow.com/questions/757435/… це може бути, ви використовуєте котирування або карету, щоб перейти до svn, то, можливо, ви використовуєте зворотній
косий ривок

Ви також можете спробувати svn cygwin, якщо вам цікаво .. з прикладом відповіді на це запитання і побачити, чи якісь варіанти чи їх варіанти працюють для вас.
барлоп

5
Символ карети безпосередньо відповідає на моє запитання, тому я прийму вашу відповідь. На жаль, команда SVN, схоже, не розпізнає її! Якщо я спробую це, я отримаю це повідомлення про помилку "svn 'C:' не є робочою копією". У мене є ще один спосіб його обходу, і це просто "cd" до каталогу, а потім виконайте команду SVN один раз там. Я можу навіть зв'язати дві команди разом в одному рядку за допомогою оператора &&: cd "c: \ Документи та параметри \ ім'я користувача \ svn" && SVN додати *. *
Девід

на прикладі компакт-дисків, карета не потрібна, компакт-диск не потребує місця
барлоп

1
@ Chinggis6 цікаво .. він також не працює для DIR. І копія, і редактор вбудовані в команди .. хоча це і CD. Хоча копія та редактор приймають ім'я файлу як параметр. Можливо, варто запитати на форумі
dostips

35

Я виявив, що розміщення лапок лише в одній частині місцеположення працює. У вашому випадку:

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

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


7
також якщо ви хочете бути мінімалістичними, можна робити цитати просто простору або просто символи, що містять простір, наприклад, C: \> cd документи "та se" ttings (хоча це, наприклад, CD-приклад, не потрібно бігти пробіли)
барлоп

1
Дуже дякую. Я, можливо, відмовив би 4 або 5 разів, якщо це можливо ..
Sayka

@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


15
Яке безладдя програмувати в пакеті Windows ...
Кланген

Дякую. Чи можемо ми визначити, чи використовується CD argv[]чи GetCommandLine()? pastebin.com/raw/t55iv0JS
барлоп

7

Здається, ім'я короткого файлу працює як вітер.

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

Для збільшення пам’яті ..;)


8
він може не працювати, якщо коротке ім’я файлу було вимкнено
phuclv


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-розділи


0

Слідкуючи за публікацією @ Панга та іншими особами, які обговорюють короткі імена та підводні камені, ось як динамічно вирішити довге ім’я до короткого імені:

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

Тоді, очевидно, ви можете використовувати коротке ім'я, а не навколишні лапки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.