从Windows脚本中的命名环境变量中删除引号

时间:2008-11-20 22:53:07

标签: windows batch-file scripting environment-variables quotes

我想在Windows环境变量中存储URL前缀。查询字符串中的&符号使这很麻烦。

例如:我的网址前缀为http://example.com?foo=1&bar=,并希望通过为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 个答案:

答案 0 :(得分:37)

echo%myvar:“=%

答案 1 :(得分:30)

这不是对环境变量的限制,而是命令shell。

将整个作业括在引号中:

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

虽然如果你试图回应这个,它会抱怨因为shell会在那里看到中断。

您可以通过将var名称括在引号中来回显它:

echo "%myvar%"

或者更好,只需使用set命令查看内容:

set myvar

答案 2 :(得分:9)

这有效

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

如果我想打印包含的变量和没有引号的&符号,我也会使用它。

for %a in ("fish & chips") do echo %~a

答案 3 :(得分:9)

虽然已有几个好的答案,但删除引号的另一种方法是使用一个简单的子程序:

: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

答案 4 :(得分:2)

使用延迟环境变量扩展并使用!var:~1,-1!删除引号:

@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!

答案 5 :(得分:2)

仅从变量中删除开头和结尾引号:

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

这假设您的值中没有###“或”###,如果变量为NULL则不起作用。

此方法可获得http://ss64.com/nt/syntax-esc.html

答案 6 :(得分:1)

使用多个变量来执行此操作:

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

set bar=true

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

start iexplore %launch%

答案 7 :(得分:0)

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

这是因为变量包含特殊的shell字符。

答案 8 :(得分:-1)

我认为应该这样做:

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

但你不需要这个,

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

也会工作,你只需要为start命令提供一个标题。