列出批处理文件中的键值对

pre*_*eze 3 batch-file

我正在编写一个 Windows 批处理脚本来处理用户输入。输入字符串如下所示:

key1=value1 key2=value2 key3="value 3"
Run Code Online (Sandbox Code Playgroud)

即用空格分隔的对的序列,每对的格式为key=value,其中value可以被引用。引用的值可能包含空格。这种对的数量不是固定的——从 1 到任何合理的数字,取决于用户。

对于每一对,我需要创建一个名为key的环境变量并为其分配

最初,我尝试使用下面的代码迭代该字符串(对于演示,我对 INPUT 字符串进行了硬编码,但通常它会作为参数传递给脚本):

@ECHO OFF
set INPUT=key1=value1 key2=value2 key3="value 3"
for %%i in (%INPUT%) do (
    echo %%i
)
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它不仅被空格分割,而且还被 = 分割,只给出单个标记的输出序列,而不是键=值对:

d:\home\work>testParameters.bat
key1
value1
key2
value2
key3
"value 3"
Run Code Online (Sandbox Code Playgroud)

我看到这for /f %%i in ("%INPUT%")可能会奏效,但它带来了一个不同的问题:正如我之前所说,对的数量可能会有所不同,我不清楚我将如何迭代所有这些。

请问这里有什么建议吗?

Aac*_*ini 5

@echo off
setlocal EnableDelayedExpansion

set INPUT=key1=value1 key2=value2 key3="value 3"
for %%a in (%input%) do (
   if not defined varname (
      set varname=%%a
   ) else (
      set !varname!=%%a
      set "varname="
   )
)
Run Code Online (Sandbox Code Playgroud)

只要值没有逗号、分号、空格或等号,以前的方法就可以工作,除非它们用引号引起来。