batch-file - 如何在批处理文件的 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
解决方案
您可以使用这种更简单的方法:
@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 字符...;)
推荐阅读
- swift - update notificationToken when user authenticated changes - Swift - Programmatically
- css - Border not div's full width
- kotlin - Handle multiple exceptions in Kotlin Kotest eventually
- string - get specific word from one column in select query
- bash - How to replace text contains'\n' with sed in macos 11.1
- python - divide packet bytes by 255 in python
- javascript - JS Date cannot get the last day of month with 31 days
- sql - How to create an autoincrement ID attribute for a class in Matisse(ODL)?
- java - How to get json from GraphQL
- asp.net - 如何使用 asp.net 获取 Authorization_code 和 access_Token 并发送信封 DocuSign