Вопрос

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

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

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

Спасибо.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Это зависит от того, как вы хотите использовать переменную.Если вы просто хотите использовать значение переменной без кавычек, вы можете использовать либо отложенное расширение и подстановку строки, либо 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

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

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

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

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

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

Используйте jscript.

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

Затем кто- то указал мне на Тест Джоэла, Я был особенно очарован пунктом 2 и приступил к объединению всех моих маленьких скриптов сборки в один скрипт сборки ...

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

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

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

Интерпретатор команд Windows позволяет заключать всю команду set в кавычки (допустимо во всех версиях Windows NT от NT 4.0 до Windows 2012 R2).

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

@echo OFF

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

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

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

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

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

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

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

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

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

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

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

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

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

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

повторите переменную В кавычках:

Echo."%myvar%"

повторите переменную БЕЗ кавычек:

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>

Попробуйте использовать экранирующий символ '^', например

set myvar=c:\my music ^& videos

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

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

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

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

set myvar = c:\my music

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

Редактировать:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top