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

isi*_*ons 2 batch-file

我想解析一行文本,其中单词由空格分隔,并将每个单词存储在其自己的数组模拟变量中。根据ss64我应该能够做到这一点。我可能不理解 delims 或令牌,因为我的代码适用于 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[
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

我期望的输出是:

words[0]=foo
words[1]=bar
words[2]=baz
Run Code Online (Sandbox Code Playgroud)

Aac*_*ini 6

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

@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[
Run Code Online (Sandbox Code Playgroud)

如果您想了解神奇之处,请删除@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[
Run Code Online (Sandbox Code Playgroud)

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