首页 > 解决方案 > 如何在批处理文件的 for 循环中解析一行文本并将各个字符串存储在数组中?

问题描述

我想解析一行文本,其中单词用空格分隔,并将每个单词存储在自己的数组模拟变量中。根据ss64我应该能够做到这一点。我可能不理解分隔符或标记,因为我的代码适用于 1 次迭代并停止。

::@echo off
setlocal enabledelayedexpansion
set string=foo bar baz
set /a index=0

for /F "tokens=* delims= " %%i in ("foo bar baz") do (
    echo %%i
    echo !index!
    set words[%index%]=%%i
    set /a index+=1
    echo !index!
)

set words[

这是我通过调试回显得到的输出:

C:\Users\isimm\Desktop\batintercept>stringparse.cmd

C:\Users\isimm\Desktop\batintercept>setlocal enabledelayedexpansion

C:\Users\isimm\Desktop\batintercept>set string=foo bar baz

C:\Users\isimm\Desktop\batintercept>set /a index=0

C:\Users\isimm\Desktop\batintercept>for /F "tokens=* delims= " %i in ("foo bar baz") do (
echo %i
 echo !index!
 set words[0]=%i
 set /a index+=1
 echo !index!
)

C:\Users\isimm\Desktop\batintercept>(
echo foo bar baz
 echo !index!
 set words[0]=foo bar baz
 set /a index+=1
 echo !index!
)
foo bar baz
0
1

C:\Users\isimm\Desktop\batintercept>set words[
words[0]=foo bar baz

tokens=* 给我上面的输出,tokens=1,2,3 只给我第一个词,tokens=1 或 tokens=2 或 tokens=3 给我第一个、第二个或第三个词。据我了解,“delims=”是多余的,因为默认情况下使用空格,但无论我是否包含 delims,都是一样的。

我还尝试使用下划线以防空格存在一些错误,并尝试将文本放入 foo.txt 文件而不是文字字符串中。在这两种情况下,我都得到与原始字符串相同的结果。

我期待的输出是:

words[0]=foo
words[1]=bar
words[2]=baz

标签: batch-file

解决方案


您可以使用这种更简单的方法:

@echo off
setlocal EnableDelayedExpansion

set string=foo bar baz
set /a index=0

set "words[%index%]=%string: =" & set /A index+=1 & set "words[!index!]=%"

set words[

如果您想了解神奇之处,请删除@echo off行,运行批处理文件并仔细查看屏幕。以字符串为分隔符的拆分字符串的更多详细信息

编辑添加了新方法

你也可以使用这个有点神秘的方法:

@echo off
setlocal EnableDelayedExpansion

set string=foo bar baz
set /a index=0

for /F %%i in (^"!string: ^=^
% Do not remove this line %
!^") do (
   set words[!index!]=%%i
   set /A index+=1
)

set words[

在这种方法中,空格被替换为 LF ASCII 字符...;)


推荐阅读