Удалить кавычки из именованных переменных среды в сценариях Windows
-
08-07-2019 - |
Вопрос
Я хочу сохранить префикс URL-адреса в переменной среды Windows. Амперсанды в строке запроса делают это проблематичным.
Например: у меня есть префикс URL-адреса http://example.com?foo=1&bar=
и я хочу создать полный URL-адрес, указав значение для панели параметр
. Затем я хочу запустить этот 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%
Какой синтаксис для этого?
Решение
Это не ограничение переменной среды, а командная оболочка.
Заключите все назначение в кавычки:
set "myvar=http://example.com?foo=1&bar="
Хотя, если вы попытаетесь повторить это, он будет жаловаться, так как оболочка увидит там разрыв.
Вы можете повторить это, заключив имя переменной в кавычки:
echo "%myvar%"
Или лучше, просто используйте команду set для просмотра содержимого:
set myvar
Другие советы
echo% myvar: " =%
Это работает
for %a in (%myvar%) do set myvar=%~a
Я бы также использовал это, если бы хотел напечатать переменную, которая содержала и амперсанд без кавычек.
for %a in ("fish & chips") do echo %~a
Хотя уже есть несколько хороших ответов, другой способ удалить кавычки - использовать простую подпрограмму:
: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
Используйте отложенное расширение переменной среды и используйте! var: ~ 1, -1! чтобы удалить кавычки:
@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
Чтобы удалить только начальные и конечные кавычки из переменной:
SET myvar=###%myvar%###
SET myvar=%myvar:"###=%
SET myvar=%myvar:###"=%
SET myvar=%myvar:###=%
Предполагается, что у вас нет ### " или " ### внутри вашего значения и не работает, если переменная равна NULL.
Кредит предоставляется http://ss64.com/nt/syntax-esc.html для этого метода.
Используйте несколько переменных, чтобы сделать это:
set myvar="http://example.com?foo=1&bar="
set bar=true
set launch=%testvar:,-1%%bar%"
start iexplore %launch%
@echo off
set "myvar=http://example.com?foo=1&bar="
setlocal EnableDelayedExpansion
echo !myvar!
Это потому, что переменная содержит специальные символы оболочки.
Я думаю, что это должно сделать это:
for /f "tokens=*" %i in (%myvar%) do set %myvar%=%~i
Но тебе это не нужно,
set myvar="http://example.com?foo=1&bar="
start "" %myvar%
Также будет работать, вам просто нужно указать заголовок для команды запуска.