/ f的批处理文件没有转义双引号

时间:2018-02-04 06:17:15

标签: batch-file

所以我使用curl从GitHub获取经常更改的下载链接。 使用for / f我可以分割每个前斜线'/'

卷曲的字符串

我得到的变量看起来像这样

v0.30.2" >重定向<

由此,我设法使用子字符串提取版本,但是当字符数改变时它无法工作,所以我必须手动编辑子字符串长度。

解决问题 我试图实现一个for / f从上面的变量中提取数字,所以我需要使用theese标志作为分隔符 v。 “然而,每当我尝试使用双引号作为分隔符时,我都无处可去。我读到使用转义字符是可行的方法,但我没有运气。有人可以帮忙吗?

最近破解这个问题的尝试看起来像这样:

SetLocal EnableDelayedExpansion
set myStr=v0.30.2^"^>redirected^<
for /f tokens^=1-3 delims^=^.^"^v %%A in ("%myStr%") do (
   echo %%A
   echo %%B
   echo %%C
)
pause

预期输出应为

0
30
2

2 个答案:

答案 0 :(得分:3)

你错过了一个插入符号,因为表达式tokens=1-3 delims=.v"需要是解析器的一个块。
通常只需引用FOR /F "tokens=1-3 delims=.v"中的块即可实现这一目标 但是在双引号应该在分隔符列表中的特殊情况下,必须省略外部引号,而是必须使用插入符号粘贴块。

for /f tokens^=1-3^ delims^...

myStr的扩展应该通过延迟扩张而不是扩大百分比来完成。

@echo off
SetLocal EnableDelayedExpansion
set ^"myStr=v0.30.2">redirected<"
for /f tokens^=1-3^ delims^=^.^"v %%A in ("!myStr!") do (
   echo %%A
   echo %%B
   echo %%C
)

答案 1 :(得分:2)

我假设你的%myStr%变量实际上是先前尝试从一行中检索字符串的一部分。如果是这种情况,那么您可以进一步解析该行以仅检索版本号。

首先是这样的:

Rem drop everything at the first doublequote
Set "myStr=%myStr:"="&:"%"

然后这个:

Rem keep everything from the first v
Set "myStr=%myStr:*v=%"

如果你想输出它的各个部分:

For %%A In (%myStr:.= %) Do Echo %%A