Работа с кавычками в командных сценариях Windows - программирование
Подтвердить что ты не робот

Работа с кавычками в командных сценариях Windows

В пакетном файле Windows, когда вы делаете следующее:

set myvar="c:\my music & videos"

переменная myvar сохраняется с включенными кавычками. Честно говоря, я нахожу это очень глупым. Кавычки - это просто указать, где начинается и заканчивается строка, а не сохраняться как часть самого значения.
Как я могу предотвратить это?

Спасибо.

4b9b3361

Ответ 1

set "myvar=c:\my music & videos"

Обратите внимание на начало цитат перед myvar. Это на самом деле так просто. Боковое примечание: myvar не может быть отозван после этого, если он не заключен в кавычки, потому что и будет считан как разделитель команд, но он все равно будет работать как путь.

http://ss64.com/nt/set.html в разделе "Имена переменных могут включать пробелы"

Ответ 2

Это правильный способ сделать это:

set "myvar=c:\my music & videos"

Кавычки не будут включены в значение переменной.

Ответ 3

Это зависит от того, как вы хотите использовать переменную. Если вы просто хотите использовать значение переменной без кавычек, вы можете использовать замедленное расширение и замену строки или команду for:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

В качестве состояний andynormancx необходимы кавычки, поскольку строка содержит &. Или вы можете избежать его с помощью ^, но я думаю, что цитаты немного чище.

Если вы используете замедленное расширение с заменой строки, вы получаете значение переменной без кавычек:

@echo !myvar:"=!
>>> C:\my music & videos

Вы также можете использовать команду for:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

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

  • Использование замены строк и замедленного расширения для использования значения переменной без кавычек, но используйте переменную в команде:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  • Использование команды for для использования значения переменной без кавычек, но вам придется окружать переменную кавычками при ее использовании в командах:

    @echo OFF
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

Короче говоря, на самом деле нет чистого способа использовать путь или имя файла, содержащее встроенные пространства и/или & в пакетном файле.

Ответ 4

Использовать jscript.

Многие луны назад (т.е. около 8 лет дают или берут) Я работал над большим проектом С++/VB6, и у меня было несколько бит Batch Script, чтобы сделать части сборки.

Затем кто-то указал мне на Joel Test, я был особенно влюблен в пункт 2 и решил принести все мои маленькие скрипты сборки в один single build Script.,.

и это почти сломало мое сердце, заставив все эти маленькие скрипты работать вместе, на разных машинах, с немного разными настройками, боги, это было ужасно - в частности, установление переменных и передача параметров. Это было действительно хрупкое, малейшее дело сломало бы его и потребовало бы 30 минут настройки, чтобы снова идти.

В конце концов - я могу быть упрямым - Я забросил всю игру и за день переписал все это в JavaScript, запустив его из командной строки с CScript.

Я не оглядывался назад. Хотя в наши дни это MSBuild и Cruise Control, если мне нужно что-то даже немного задействовать с пакетом script, я использую jscript.

Ответ 5

Командный интерпретатор Windows позволяет использовать кавычки вокруг всей команды набора (действителен в каждой версии Windows NT от NT 4.0 до Windows 2012 R2)

Ваш script должен быть написан следующим образом:

@echo OFF

set "myvar=C:\my music & videos"

Затем вы можете поместить кавычки вокруг переменных по мере необходимости.

Работа с приглашением CMD может казаться эзотерическим время от времени, но интерпретатор команд действительно ведет себя довольно твердо, подчиняясь его внутренней логике, вам просто нужно переосмыслить вещи.

Фактически команда set не требует, чтобы вы использовали кавычки вообще, но как то, как вы выполняете назначение переменной, так и способ использования кавычек не может вызвать лишние пробелы вокруг вашей переменной, когда вы отлаживаете script.

например. Оба нижеследующих являются технически допустимыми, но вы можете иметь конечные пробелы, поэтому это не очень хорошая практика:

set myvar=some text   
set myvar="some text" 

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

set "myvar=Some text"
(set myvar=Some value)

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

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

Таким образом, вы должны использовать:

set myvar="c:\my music & videos"

Однако, несмотря на то, что переменная IS правильно настроена на эту строку, когда вы ECHO на sting, интерпретатор команд интерпретирует амперсанд, поскольку ключевое слово указывает, что следующий оператор следует.

SO, если вы хотите повторить строку из переменной, интерпретатору CMD все равно нужно сообщить ему текстовую строку или если вы не хотите, чтобы кавычки отображались, вам нужно выполнить одно из следующих действий:

эхо переменная WITH Quotes:

Echo."%myvar%"

эхо переменная WITHOUT Quotes:

Echo.%myvar:&=^&%
<nul SET /P="%myvar%"

В приведенных выше двух сценариях вы можете повторять строку без каких-либо кавычек. Пример ниже:

C:\Admin>    Echo.%myvar:&=^&%
C:\my music & videos

C:\Admin>    <nul SET /P="%myvar%"
C:\my music & videos
C:\Admin>

Ответ 6

У вас должны быть кавычки, если текст, который вы устанавливаете, включает определенные символы, включая &. Если ваш текст не включал &, вам не нужны кавычки.

Например, если текст был просто "c:\my music", вы могли бы сделать:

set myvar = c:\my music

Но поскольку у вашего текста есть &, вам нужны кавычки.

Edit:

Или, как говорит Дэйв в своем ответе, вы можете избежать проблемных символов с помощью ^^^, но остерегайтесь этого подхода, поскольку & не единственный персонаж, которого вы нужно бежать. На практике гораздо проще придерживаться кавычек, а не избегать всех проблемных символов.

Ответ 7

Попробуйте использовать escape-символ '^', например

set myvar=c:\my music ^& videos

Вы будете осторожны при расширении myvar, потому что оболочка может не обрабатывать и как литерал. Если вышеописанное не работает, попробуйте также вставить каретку в строку:

set myvar=c:\my music ^^^& videos