Batch file 如何循环字符串中的标记?
假设我有一个字符串,比如foo:bar:baz,是否可以循环通过这个字符串?看起来您可以标记一个文件的行,但下面只会回显“foo”一次Batch file 如何循环字符串中的标记?,batch-file,Batch File,假设我有一个字符串,比如foo:bar:baz,是否可以循环通过这个字符串?看起来您可以标记一个文件的行,但下面只会回显“foo”一次 for/f“tokens=1,2*delims=:“%%x in(%%j”)执行echo%%x按预期执行,它将其标记为%%x%%y%z。因此,您可能不只是处理%%x,而是 for /f "tokens=* delims=:" %%x in ("foo:bar:baz") do ( echo %%x echo %%y echo %%z ) 或者如果你
for/f“tokens=1,2*delims=:“%%x in(%%j”)执行echo%%x
按预期执行,它将其标记为%%x
%%y
%z
。因此,您可能不只是处理%%x
,而是
for /f "tokens=* delims=:" %%x in ("foo:bar:baz") do (
echo %%x
echo %%y
echo %%z
)
或者如果你事先不知道你得到了多少东西,你可以
@echo off
set string=foo:bar:baz
:again
for /f "tokens=1* delims=:" %%x in ("%string%") do (
echo %%x
set string=%%y
)
if not .%string%==. goto again
echo done
对于值,分隔符可以是空格、逗号、分号和等号。如果元素用这些字符中的任何一个分隔,则可以直接处理字符串。如果不是,只需更改其中一个字符的分隔符(正如我上面所做的)
阿奇尼抢先找到了我的第一个解决方案。它可以通过添加引号来改进,这样字符串就可以包含空格和特殊字符,并且仍然可以给出正确的结果
set "str=foo bar:biz bang:this & that"
for %%S in ("%str::=" "%") do echo %%~S
该解决方案有以下局限性:
- 不,还是?可以显示在字符串中
- 如果字符串已经包含引号(“),则会出现问题,特别是如果还有特殊字符
:
分隔符。请注意,下面的解决方案中的空行是棘手替换的关键部分。此外,以下行必须以开头终止延迟变量扩展的代码>。不应该有任何前导空格
另一个需要担心的是/F“EOL”选项的麻烦。我们不想跳过任何以下线字符开头的值,即代码>默认情况下。因为我们已经消除了字符串分隔符:
,所以我们可以安全地将其用作下线
最后,我们需要使用延迟扩展,但是如果我们不首先在循环中禁用延迟扩展,则代码>将在%%S扩展期间损坏
set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?"
setlocal enableDelayedExpansion
set ^"str=!str::=^
!"
for /f "eol=: delims=" %%S in ("!str!") do (
if "!!"=="" endlocal
echo %%S
)
我相信这项技术可以处理你扔给它的任何东西
jeb是第一个向我展示如何在批处理中处理行提要的人,特别是如何使用这种技术。它甚至可能已经发布到其他地方了。这将把字符串解析成可在循环之外访问的变量(
嗯,我想我想要的是能够循环通过令牌,就像我可以循环通过文件中的行一样。一个很好的方法是:你能告诉我为什么在字符串替换时要像^“
那样逃逸第一个引号吗?为什么不逃逸第二个引号呢?啊,该死的,愚蠢的我!我知道了:一个未逃逸的”
会让^
从字面上保留下来……奇怪的是,我发现这不是通过测试代码,而是通过关注一些完全不同的东西,因为我发布了评论;很无聊,不是吗?;-)
set "str=foo bar:biz bang:this & that"
for %%S in ("%str::=" "%") do echo %%~S
set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?"
setlocal enableDelayedExpansion
set ^"str=!str::=^
!"
for /f "eol=: delims=" %%S in ("!str!") do (
if "!!"=="" endlocal
echo %%S
)
setlocal enabledelayedexpansion
set your_string="whatever:you:want"
for /f "tokens=1,2,3 delims=:" %%a in ('echo !your_string!') do (
set first_sub_string=%%a
set second_sub_string=%%b
set third_sub_string=%%c
)
echo Congrats. !your_string! was parsed as !first_sub_string!, !second_sub_string!, !third_sub_string!