【问题标题】:Batch How to treat dynamic FOR /F loop results with unknown amount of returned parameters批处理如何处理返回参数数量未知的动态 FOR / F 循环结果
【发布时间】:2018-03-20 14:16:37
【问题描述】:

我有一个在 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

它正确返回数据并扩展可能的变量,例如 (CALL SET)

但是,如果我尝试在 Windows 10 上使用它......它会失败 - 似乎 w10 不喜欢文字 TAB,因为我使用文字 TAB 绝对没有结果。如果我删除分隔符,它就变成了一个空格(不是我在某些地方读到的 TAB 和/或空格)但是我不能将空格用作分隔符作为值,否则数据本身可能包含空格并且会破坏目的。

【问题讨论】:

  • "... tokens=2,* ..." %%A in ... DO CALL SET "%~1=%%B"
  • skip 不是必需的,因为无论如何%~1 将从输出的最后一行设置。您还可以将反引号 ` 更改为单引号 ',并删除 usebackq 选项。
  • 这将在键值中没有空格时起作用 - 跳过对于此目的来说是完全足够的
  • 删除CALL,因为它充其量是多余的,但它也会给你带来讨厌的副作用
  • 您的意思是可以在没有它的情况下执行命令,还是您的意思是在上述几行的上下文中?如果没有前面的调用,它只会成为标签而不是函数调用,不是吗?

标签: windows batch-file for-loop delimiter


【解决方案1】:

好的,在发现我不会从 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

【讨论】:

  • 我只是想提出类似的建议,但这样效果更好。您在我上面的评论中基本上扩展了我的想法。我在想您可以将所有内容分配给变量,然后进行字符串替换以从输出中删除 %3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多