Удалить кавычки из именованных переменных среды в сценариях Windows - PullRequest
54 голосов
/ 21 ноября 2008

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

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

Добавление кавычек вокруг значения для операции 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%

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

Ответы [ 9 ]

37 голосов
/ 19 декабря 2008

эхо% myvar: "=%

30 голосов
/ 21 ноября 2008

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

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

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

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

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

echo "%myvar%"

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

set myvar
9 голосов
/ 02 марта 2013

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

: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
9 голосов
/ 27 декабря 2011

Это работает

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

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

for %a in ("fish & chips") do echo %~a
2 голосов
/ 12 октября 2011

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

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

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

Кредит идет на http://ss64.com/nt/syntax-esc.html для этого метода.

2 голосов
/ 10 мая 2010

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

@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
1 голос
/ 28 сентября 2011

Используйте несколько переменных, чтобы сделать это:

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

set bar=true

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

start iexplore %launch%
0 голосов
/ 24 ноября 2014
@echo off
set "myvar=http://example.com?foo=1&bar="
setlocal EnableDelayedExpansion
echo !myvar!

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

0 голосов
/ 21 ноября 2008

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

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

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

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

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

...