在Windows脚本中从命名的环境variables中删除引号

我想在Windows环境variables中存储一个URL前缀。 查询string中的&符号使得这个麻烦。

例如:我有一个http://example.com?foo=1&bar=的URL前缀,并希望通过为bar参数提供一个值来创build一个完整的URL。 然后我想使用“开始”命令启动该URL。

围绕SET操作的值添加引号很容易:

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

Windows包括实际值中的引号(谢谢Windows!):

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

我知道我可以通过使用波浪号从batch file参数中除去引号:

 echo %~1 

但是,我似乎无法做到命名variables:

 echo %~myvar% %~myvar% 

完成这个的语法是什么?

这不是环境variables的限制,而是命令shell。

用引号括起整个作业:

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

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

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

 echo "%myvar%" 

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

 set myvar 

echo%myvar:“=%

这工作

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

如果我想打印一个包含和&符号而没有引号的variables,我也会使用它。

 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 

使用延迟的环境variables扩展并使用!var:〜1,-1! 删除引号:

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

要从variables中只删除开始和结束的引号:

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

这假定你的值中没有###“或者”###“,如果variables为NULL,则不起作用。

有关此方法,请参阅http://ss64.com/nt/syntax-esc.html

使用多个variables来做到这一点:

 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! 

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

我认为这应该做到这一点:

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

但是你不需要这个,

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

也可以工作,你只需要给开始命令提供一个标题。