在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%
也可以工作,你只需要给开始命令提供一个标题。