使用批处理文件相应地从2个不同的文件中提取变量

时间:2017-05-26 17:36:20

标签: batch-file

我想相应地从2个不同的文件中提取变量。

意味着如果fileA具有这些值

FIRST
SECOND
THIRD

而fileB有

A
B
C

它应该出现:

FIRST, A
SECOND, B
THIRD, C

这是我到目前为止编码的内容:

for /f "tokens=*" %%a in (%FileA%) do (
  for /f "tokens=*" %%i in (%FileB%) do (
    echo %%i, %%a
  )
)

但是它不会正确匹配,这意味着它将是:

FIRST, A
FIRST, B
FIRST, C
SECOND, A
SECOND, B
SECOND, C
THIRD, A
THIRD, B
THIRD, C

1 个答案:

答案 0 :(得分:3)

当您通过for /F循环阅读一个文本文件时,您可以同时阅读两个文本文件,而set /Pinput redirection阅读另一个文本文件,如下所示:

setlocal EnableDelayedExpansion
< "fileB.txt" (
    for /F "usebackq delims=" %%L in ("fileA.txt") do (
        set "LINE=" & set /P LINE=""
        echo(%%L, !LINE!
    )
)
endlocal

要使上述代码生效,以下限制适用:

  • 文本文件必须是ASCII / ANSI文本文件,而不是Unicode;
  • 文本文件必须包含Windows样式的换行符(回车加行换行);
  • 文件fileA.txt不得包含超过约8190字节/字符的行;
  • file fileB.txt不得包含长度大于1021字节/字符的行;
  • 文本文件应包含相同数量的行;实际上,fileA.txt定义了从两个文件中读取的行数,因此如果包含更多行,则可能会忽略fileB.txt行,如果包含少于fileA.txt,则可以假定为空行。 ;
  • fileA.txt不应包含空行,因为for /F;
  • 会忽略这些行
  • fileA.txt不应包含以;开头的行,因为for /F由于其默认eol选项而被忽略;
  • fileA.txt不应包含!,因为这可能会丢失或导致意外结果,因为在for /F变量引用%%L的扩展期间启用了延迟变量扩展;

要克服上述最后三个限制,您可以使用以下代码:

setlocal DisableDelayedExpansion
< "fileB.txt" (
    for /F "delims=" %%L in ('findstr /N "^" "fileA.txt"') do (
        set "LINEA=%%L"
        set "LINEB=" & set /P LINEB=""
        setlocal EnableDelayedExpansion
        echo(!LINEA:*:=!, !LINEB!
        endlocal
    )
)
endlocal

以下是它的工作原理:

  • findstr /N在每个匹配行前面都有一个行号和:,搜索字符串^与所有行匹配,因此fileA.txt的任何一行都不会显示为空{{1} }},for /F;
  • 不再忽略这些行
  • 所述行号前缀避免for /F显示为第一个字符,因此;不再忽略以该字符开头的fileA.txt行;
  • 由于在for /F变量引用for /F的扩展期间不再启用延迟变量扩展,但仅在实际需要时,包含%%L的行不再有问题;