批处理文件中的嵌套/ F循环和If语句

时间:2017-05-17 11:39:47

标签: batch-file for-loop nested

我有两个.txt文件。一个包含数字,另一个包含文件路径。我想将这两个文件合并到.csv。该组合基于数字(来自nrs.txt)在文件路径的字符串(nodups.txt)中。

现在我有以下代码:

@setlocal enableextensions enabledelayedexpansion

for /F %a IN (Output\nrs.txt) DO (
    SET "nrs=%a"

    for /F %b IN (Output\nodups.txt) DO (
        SET "pathstring=%b"
        SET csvdelim=,
        IF NOT x!pathstring:%nrs%=""!==x%pathstring% %nrs%,%pathstring%>>new2017.txt
    )
)

@endlocal

但是,我在代码中遇到以下问题:

  1. 似乎永远不会设置pathstring。 (当我运行没有if语句的代码时,nrs变量设置为the pathstring is set to %b)。我已经在这里看到了很多可能的解决方案,但似乎没有一个适用于我(设置!var!和使用usebackq等变量)。
  2. 第二个for循环中的IF语句收到以下错误消息=""!==x%pathstring% was unexpected at this time=""应删除nr。从路径(如果它在那里)。当我用其他东西替换“”时,它仍然不起作用。
  3. 文件内容为:

    档案nrs.txt:

    12345
    12245
    16532
    

    nodubs.txt:

    C:\tmp\PDF_16532_20170405.pdf
    C:\tmp\PDF_1234AB_20170405.pdf
    C:\tmp\PDF_12345_20170506.pdf
    

    期望的输出:

    12345, C:\tmp\PDF_12345_20170506.pdf
    16532, C:\tmp\PDF_16532_20170405.pdf
    

    我真的希望有人可以帮我解决这个问题!

3 个答案:

答案 0 :(得分:1)

此解决方案使用基于arrays的不同方法:

@echo off
setlocal EnableDelayedExpansion

rem Load array from nodubs.txt file
pushd "Output"
for /F "tokens=1,2* delims=_" %%a in (nodubs.txt) do set "nodubs[%%b]=%%a_%%b_%%c"

rem Process nrs.txt file and show output
(for /F %%a in (nrs.txt) do (
   if defined nodubs[%%a] echo %%a, !nodubs[%%a]!
)) > new2017.txt

答案 1 :(得分:0)

  • 在变量的批处理文件中需要两个百分号。
  • 无需将%%A放入变量中,直接使用它。
@setlocal enableextensions enabledelayedexpansion
for /F %%a IN (Output\nrs.txt) DO (
    findstr /i "_%%a_" Output\nodups.txt >NUL 2>&1 || >>new2017.txt Echo %%a
)
@endlocal
  • 我使用findstr来搜索包含在下划线中的nrs.txt条目,而不是第二个。
  • 如果没有找到在失败||上使用condiotonal执行来写入新文件。

答案 2 :(得分:0)

根据改变预赛的另一个答案。

@Echo on
Pushd Output
for /F "tokens=1-3 delims=_" %%A IN (
  ' findstr /G:nrs.txt nodubs.txt'
) DO >>"..\new2017.txt" Echo %%B, %%A_%%B_%%C
Popd

示例输出:

> type ..\new2017.txt
16532, C:\tmp\PDF_16532_20170405.pdf
12345, C:\tmp\PDF_12345_20170506.pdf