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

Batch file 使用批处理文件从2个不同的文件中相应地提取变量,batch-file,Batch File,我想相应地从两个不同的文件中提取变量 这意味着如果fileA具有这些值 FIRST SECOND THIRD 还有文件B 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,

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

这意味着如果fileA具有这些值

FIRST
SECOND
THIRD
还有文件B

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

通过
for/F
循环读取一个文本文件和通过
set/p
读取另一个文本文件时,可以同时读取两个文本文件,如下所示:

setlocal EnableDelayedExpansion
<“fileB.txt”(
对于/F“usebackq delims=“%%L in”(“fileA.txt”)do(
设置“行=“&set/P行=“”
回音(%%L,!行!
)
)
端部
要使上述代码正常工作,以下限制适用:

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

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

setlocal DisableDelayedExpansion
<“fileB.txt”(
对于/F“delims=“%%L in('findstr/N“^”fileA.txt“)do(
设置“LINEA=%%L”
设置“LINEB=”&设置/P LINEB=“”
setlocal EnableDelayedExpansion
回声(!LINEA::=!,!LINEB!
端部
)
)
端部
以下是它的工作原理:

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

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

setlocal EnableDelayedExpansion
<“fileB.txt”(
对于/F“usebackq delims=“%%L in”(“fileA.txt”)do(
设置“行=“&set/P行=“”
回音(%%L,!行!
)
)
端部
要使上述代码正常工作,以下限制适用:

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

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

setlocal DisableDelayedExpansion
<“fileB.txt”(
对于/F“delims=“%%L in('findstr/N“^”fileA.txt“)do(
设置“LINEA=%%L”
设置“LINEB=”&设置/P LINEB=“”
setlocal EnableDelayedExpansion
回声(!LINEA::=!,!LINEB!
端部
)
)
端部
以下是它的工作原理:

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