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

StackOverflow https://stackoverflow.com/questions/307198

Вопрос

Я хочу сохранить префикс 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%

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

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