如何逐行循环硬编码的键值对并将每一对解析为键和值?

How to loop through hard-coded key-value pairs line by line and parse each pair into key and value?

我正在寻找下面显示的 Unix bash 代码的 Windows 批处理 (Cmd.exe) 副本。键值对由 HereDoc 给出。这些对由与 while 命令关联的 read 命令重复读取。 IFS=$';' 定义分号 (;) 作为键和值之间的分隔符。 read 命令将每一对解析为变量 kyval。循环体应对变量 $ky$val 做一些事情。请注意,值可能包含空格。

while IFS=$';' read -r ky val; do
  # Do something about $ky and $val
  echo "$ky - $val"
done < <(cat << EOF
a;P p
b;Q q
c;R r
EOF
)
# OUTPUT
# a - P p
# b - Q q
# c - R r

bash的while-do-done复合命令的概要是:

while ConditionalCommand; do COMMANDS; done

命令语句read -r ky val属于while的ConditionalCommand。

键值对列表可以看作是关联列表。但是不需要创建数组,除了list之外还会占用内存

关于Cmd.exe,我想到了

for %%i in (
a;P p
b;Q q
c;R r
) do (
rem Parse each pair into two variables.
rem Do something about the two variables.
)

但是,我不知道如何解析每一对,也不知道如何定义分隔符。

事实上,这个批处理代码甚至没有像我预期的那样工作。我预计这个批处理代码只会执行循环体三次,而 %%i 一次会收到一整对(或一整行)。然而,循环体实际上执行了九次,而 %%i 一次只收到一个字母,如以下代码所示。

@echo off
setlocal enabledelayedexpansion

set n=1
for %%i in (
a;P p
b;Q q
c;R r
) do (
rem Parse each pair into two variables.
rem Do something about the two variables.
echo !n!
echo %%i
set /a n+=1
)

rojo对“”问题的回答(questions/30403022)模拟了一个关联数组。但是,它使用包含键值对的外部文件。我不想使用文件来提供键值对。我想硬编码键值对。那应该是逐行的;也就是说,每对一行。因此,列表必须由多行组成。我不想把列表放在像

这样的长行上
a;P pNLb;Q qNLc;R r    # <-- I do not want this

Aacini 对问题“”(questions/35639223) 的回答使用了关联数组。但是,我不需要创建数组。对于我的应用程序来说,一个硬编码的关联列表就足够了。

如果 Key/Value 对不包含任何这些字符 "?* 那么这将执行您想要的操作

for %%P in (
    "a;P p"
    "b;Q q"
    "c;R r"
) do for /F "tokens=1* delims=;" %%A in ("%%~P") do (
    echo Key: %%A  ** Value: %%B
)

每个 Key/Value 对可以单独放在一行中,如上所示,也可以放在一行中。这只是一个品味问题,只要引用的对由至少一个分隔符分隔,例如 ;,=<space><newLine>FOR 是快乐的。