批处理如何处理返回参数数量未知的动态 FOR /F 循环结果
Batch How to treat dynamic FOR /F loop results with unknown amount of returned parameters
我有一个在 xp 中运行良好但在 windows10 中失败的功能,因为我不能使用 TAB 作为分隔符,只能 SPACE
setlocal EnableDelayedExpansion
...
CALL :myfunc VARtoSET KEY VALUE
:myfunc
FOR /F "usebackq skip=2 tokens=3 delims= " %%A IN (`REG QUERY "%~2" /v "%~3"`) DO CALL SET "%~1=%%A"
goto :eof
...
endlocal
它 returns 正确的数据并扩展了可能的变量,如 (CALL SET)
但是,如果我尝试在 windows 10 上使用它......它会失败 - 似乎 w10 不喜欢文字 TAB,因为我使用文字 TAB 绝对没有结果。如果我删除定界符,它就变成了 space(不是 TAB 和/或 SPACE,正如我在某些地方读到的那样)但我不能使用 space 作为定界符,因为值或数据可能包含 space 本身,会破坏目的。
好的,在发现我不会从 w10 上的 reg 查询中得到任何 TAB 定界符后(xp 在输出中确实使用了 TAB),我决定按以下方式解决这个问题
我们有一个 KEY_VALUE 可能有空格 (%3)
我们得到一个 KEY_DATA 结果,其中可能有空格 (%1)
为了获得感兴趣的令牌的正确偏移量,我们计算传递给它的 KEY_VALUE 的元素,增加元素的计数器
:myfunc
SET /A tk_offset=1
FOR %%A IN (%~3) DO SET /A tk_offset+=1
忽略包含 DATA_TYPE 的第一个返回参数 (%tk_offset%) 并使用 (*) 其余的作为 %%B
FOR /F "skip=2 tokens=%tk_offset%,*" %%A IN ('REG QUERY "%~2" /v "%~3"') DO CALL SET "%~1=%%B"
GOTO :eof
我们将结果分配给 %1 并使用 CALL SET
扩展可能的变量
适用于 winxp 和 win10
我有一个在 xp 中运行良好但在 windows10 中失败的功能,因为我不能使用 TAB 作为分隔符,只能 SPACE
setlocal EnableDelayedExpansion
...
CALL :myfunc VARtoSET KEY VALUE
:myfunc
FOR /F "usebackq skip=2 tokens=3 delims= " %%A IN (`REG QUERY "%~2" /v "%~3"`) DO CALL SET "%~1=%%A"
goto :eof
...
endlocal
它 returns 正确的数据并扩展了可能的变量,如 (CALL SET)
但是,如果我尝试在 windows 10 上使用它......它会失败 - 似乎 w10 不喜欢文字 TAB,因为我使用文字 TAB 绝对没有结果。如果我删除定界符,它就变成了 space(不是 TAB 和/或 SPACE,正如我在某些地方读到的那样)但我不能使用 space 作为定界符,因为值或数据可能包含 space 本身,会破坏目的。
好的,在发现我不会从 w10 上的 reg 查询中得到任何 TAB 定界符后(xp 在输出中确实使用了 TAB),我决定按以下方式解决这个问题
我们有一个 KEY_VALUE 可能有空格 (%3) 我们得到一个 KEY_DATA 结果,其中可能有空格 (%1)
为了获得感兴趣的令牌的正确偏移量,我们计算传递给它的 KEY_VALUE 的元素,增加元素的计数器
:myfunc
SET /A tk_offset=1
FOR %%A IN (%~3) DO SET /A tk_offset+=1
忽略包含 DATA_TYPE 的第一个返回参数 (%tk_offset%) 并使用 (*) 其余的作为 %%B
FOR /F "skip=2 tokens=%tk_offset%,*" %%A IN ('REG QUERY "%~2" /v "%~3"') DO CALL SET "%~1=%%B"
GOTO :eof
我们将结果分配给 %1 并使用 CALL SET
扩展可能的变量适用于 winxp 和 win10