Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何循环字符串中的标记?_Batch File - Fatal编程技术网

Batch file 如何循环字符串中的标记?

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 ) 或者如果你

假设我有一个字符串,比如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
)
或者如果你事先不知道你得到了多少东西,你可以

@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!