我想解析一行文本,其中单词由空格分隔,并将每个单词存储在其自己的数组模拟变量中。根据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)
您可以使用这个更简单的方法:
@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 字符...;)