【问题标题】:Double quotes in delims=?delims中的双引号=?
【发布时间】:2019-11-15 02:09:44
【问题描述】:

我对批处理脚本非常陌生,但在我的最后一个问题中,我试图从一行文本中提取一个链接,具体来说:

83:                   href="https://beepbeep.maxresdefault.rar"><img

我想要的是这样的:

https://beepbeep.maxresdefault.rar

有人建议使用for /f 分隔字符串,我想将每个" 标记分开,只取第二个标记,因为我想要的被困在两个"" 之间。

这是我得到的:

for /f "delims=^" tokens=^2" %%G in (output2.txt) do @echo %%G %%H >> output3.txt

此时批处理崩溃了,我猜是语法错误,但我不确定问题出在哪里,可能在" 部分?

【问题讨论】:

    标签: for-loop batch-file token findstr


    【解决方案1】:

    看看我们如何在双引号中delimit,不带引号。我们已经将引号之间的变量分配给%%a,但如果我们没有分配,那么要从字符串中删除双引号,我们将变量%%a 扩展为%%~a(参见for /? 变量扩展):

    @for /f delims^=^"^ tokens^=2 %%a in (output2.txt) do @echo %%~a
    

    【讨论】:

      【解决方案2】:

      整洁的问题。

      我会这样做:

      SETLOCAL ENABLEDELAYEDEXPANSION
      
      for /F "tokens=2 delims=^>=" %%i in (output2.txt) do (
        set x=%%i
        set x=!x:"=!
        echo !x! >> output3.txt
      )
      

      注意事项:

      • 我没有对报价进行标记,而是在=(之前)和&gt;(之后)进行标记。因为,如您所知,引用很难
      • 我总是最后做delims。否则它可能会认为分隔符和标记之间的空间是分隔符。
      • 然后它使用SET 语法,允许您用一个字符替换另一个字符,从而将所有出现的双引号替换为空。
      • SETLOCAL ENABLEDELAYEDEXPANSION 是必需的,否则循环中对%x% 的每次评估都使用%x% 的原始值,这可能是错误的。我总是将此作为批处理文件的第二行。

      从你已经拥有的数量来看,我猜你已经看到了,但如果你还没有看到,我发现 ss64.com 是最好的资源。
      https://ss64.com/nt/syntax-dequote.html

      【讨论】:

      • 您发布了指向dequote 的链接但您从未使用过它? :) 而是扩展元变量以删除双引号 set "x=%%~i" 然后删除替换行 set x=!x:"=!... 话虽如此,如果您这样做,则根本不需要 delayedexpansion 并且整个脚本将简单成为for /F "tokens=2 delims=^&gt;=" %%i in (output2.txt) do echo %%~i &gt;&gt;output.txt
      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2014-04-07
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多