【问题标题】:Remove quotes from named environment variables in Windows scripts从 Windows 脚本中的命名环境变量中删除引号
【发布时间】:2010-09-23 08:38:38
【问题描述】:

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

例如:我有一个 URL 前缀 http://example.com?foo=1&bar=,并希望通过为 bar 参数提供一个值来创建一个完整的 URL。然后我想使用“start”命令启动该 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%

实现这个的语法是什么?

【问题讨论】:

  • 很少,仅一个问题就可以帮助我解决当前的问题(如何从批处理文件参数中去除引号)。在这里,它做到了。谢谢和 +1 :-)

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


【解决方案1】:

我认为应该这样做:

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

但你不需要这个,

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

也可以,您只需要为启动命令提供一个标题。

【讨论】:

  • 启动命令不起作用。 URL 中的 & 符号终止该行,从而删除最后一个 URL 参数。它会启动浏览器,但它的 URL 是错误的。
【解决方案2】:

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

将整个作业用引号括起来:

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

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

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

echo "%myvar%"

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

set myvar

【讨论】:

  • 这应该与 SET /P 一起使用吗?我尝试 SET /P "var=question"。 var 然后等于“我的空格响应”
【解决方案3】:

echo %myvar:"=%

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      使用多个变量来做到这一点:

      set myvar="http://example.com?foo=1&bar="
      
      set bar=true
      
      set launch=%testvar:,-1%%bar%"
      
      start iexplore %launch%
      

      【讨论】:

      • 嗯...myvartestvar 还是什么?
      【解决方案6】:

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

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

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

      此方法的功劳归于http://ss64.com/nt/syntax-esc.html

      【讨论】:

        【解决方案7】:

        这行得通

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

        如果我想打印一个包含和不带引号的变量,我也会使用它。

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

        【讨论】:

          【解决方案8】:

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

          :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
          

          【讨论】:

          • 很高兴其他人想到了这一点,但更深入地思考——如果变量没有引号怎么办?尽早进行中止检查会很好,而不仅仅是截断现有的变量...
          • %~2 删除所有周围的引号。如果没有引号,则不会截断。
          • rem set %1=%~2 有什么用?它看起来像是下一行的注释掉副本。此外,如果变量的内容没有被引用并且包含一个空格,这似乎会截断第一个空格之后的所有内容。除非我做错了什么,否则这似乎不适合处理文件名。
          • @jpmc26,这是一个错误留下的毫无意义的评论。我已经删除了它。感谢您提请我注意。
          【解决方案9】:
          @echo off
          set "myvar=http://example.com?foo=1&bar="
          setlocal EnableDelayedExpansion
          echo !myvar!
          

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

          【讨论】:

            猜你喜欢
            • 2017-01-30
            • 2016-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-29
            • 1970-01-01
            • 2022-07-03
            • 2010-12-29
            相关资源
            最近更新 更多