Удалите кавычки из именованных переменных среды в сценариях Windows

Я хочу сохранить префикс URL-адреса в переменной среды Windows. Однако амперсанды в строке запроса создают проблемы.

Например: у меня есть префикс URL-адреса http://example.com?foo=1&bar=, и я хочу создать полный URL-адрес, указав значение для параметра bar. Затем я хочу запустить этот URL с помощью команды «start».

Добавить кавычки вокруг значения для операции SET достаточно просто:

set myvar="http://example.com?foo=1&bar="

Windows включает кавычки в фактическое значение (спасибо Windows!):

echo %myvar%
"http://example.com?foo=1&bar=true"

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

echo %~1

Однако я не могу сделать это с именованными переменными:

echo %~myvar%
%~myvar%

Какой синтаксис для этого?


person Craig Walker    schedule 20.11.2008    source источник
comment
Редко один только вопрос помогает мне решить мою текущую проблему (как удалить кавычки из аргумента командного файла). Вот так оно и было. Спасибо и +1 :-)   -  person Jan    schedule 22.02.2012


Ответы (9)


Это не ограничение переменной окружения, а скорее командная оболочка.

Заключите все задание в кавычки:

set "myvar=http://example.com?foo=1&bar="

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

Вы можете повторить это, заключив имя переменной в кавычки:

echo "%myvar%"

Или, лучше, просто используйте команду set для просмотра содержимого:

set myvar
person zdan    schedule 20.11.2008
comment
Должно ли это работать с SET / P? Я пробую SET / P var = question. var тогда равен моему ответу с пробелами - person RoboJ1M; 08.11.2012

echo% myvar: "=%

person Community    schedule 19.12.2008

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

:unquote
  set %1=%~2
  goto :EOF

Вот полный пример использования:

@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

set words="Two words"
call :unquote words %words%
echo %words%

set quoted="Now is the time"
call :unquote unquoted %quoted%
echo %unquoted%

set word=NoQuoteTest
call :unquote word %word%
echo %word%

goto :EOF

:unquote
  set %1=%~2
  goto :EOF
person jimhark    schedule 02.03.2013
comment
Однако порадоваться, что кто-то еще подумал об этом, подумав глубже - что, если у переменной нет кавычек? было бы неплохо иметь раннюю проверку прерывания, а не просто обрезать существующую переменную ... - person BrainSlugs83; 04.04.2014
comment
% ~ 2 удаляет все окружающие кавычки. Если нет кавычек, он не обрезается. - person jimhark; 04.04.2014
comment
Для чего rem set %1=%~2? Похоже, закомментированный дубликат следующей строки. Кроме того, если содержимое переменной не заключено в кавычки и содержит пробел, это, кажется, усекает все после первого пробела. Если я не сделал что-то не так, это могло бы сделать это непригодным для работы с именами файлов. - person jpmc26; 14.05.2014
comment
@ jpmc26, это был бессмысленный комментарий, оставленный по ошибке. Я удалил это. Спасибо, что обратили на это мое внимание. - person jimhark; 14.05.2014

Это работает

for %a in (%myvar%) do set myvar=%~a

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

for %a in ("fish & chips") do echo %~a
person Chris    schedule 27.12.2011

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

SET myvar=###%myvar%###
SET myvar=%myvar:"###=%
SET myvar=%myvar:###"=%
SET myvar=%myvar:###=%

Это предполагает, что у вас нет ### "или" ### внутри вашего значения, и не работает, если переменная имеет значение NULL.

Кредит предоставляется http://ss64.com/nt/syntax-esc.html для Этот метод.

person Keith    schedule 12.10.2011

Используйте отложенное расширение переменной среды и используйте! Var: ~ 1, -1! удалить кавычки:

@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
person Christian d'Heureuse    schedule 10.05.2010

Для этого используйте несколько переменных:

set myvar="http://example.com?foo=1&bar="

set bar=true

set launch=%testvar:,-1%%bar%"

start iexplore %launch%
person CmdCrazy    schedule 27.09.2011
comment
Гм ... myvar или testvar что ли? - person Jesse Chisholm; 12.02.2015

@echo off
set "myvar=http://example.com?foo=1&bar="
setlocal EnableDelayedExpansion
echo !myvar!

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

person Amr Ali    schedule 24.11.2014

Я думаю, это должно сработать:

for /f "tokens=*" %i in (%myvar%) do set %myvar%=%~i

Но тебе это не нужно,

set myvar="http://example.com?foo=1&bar="
start "" %myvar%

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

person wimh    schedule 20.11.2008
comment
Команда запуска не работает. Амперсанд в URL-адресе завершает строку, тем самым отбрасывая последний параметр URL-адреса. Браузер запускается, но это неправильный URL. - person Craig Walker; 21.11.2008