【问题标题】:Nested /F looping and If statements in batch file批处理文件中的嵌套 /F 循环和 If 语句
【发布时间】:2017-05-17 11:39:47
【问题描述】:

我有两个 .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. 路径字符串似乎永远不会被设置。 (当我在没有 if 语句的情况下运行代码时,nrs 变量被设置但the pathstring is set to %b)。我已经在这里看到了很多可能的解决方案,但似乎没有一个对我有用(设置像 !var! 这样的变量并使用 usebackq)。
  2. 第二个 for 循环中的 IF 语句收到以下错误消息 =""!==x%pathstring% was unexpected at this time="" 应该删除 nr。从路径(如果它在那里)。当我用其他东西替换“”时,它仍然不起作用。

文件内容为:

文件 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

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

【问题讨论】:

    标签: batch-file for-loop nested


    【解决方案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
    

    【讨论】:

    • 我更喜欢这个解决方案,因为它对我来说更清楚,它是如何工作的(如果有任何变化,我知道在哪里进行调整)。但是,如果我这样运行它,我不会得到任何输出。如果我删除 @echo off 我会得到以下信息:C:\Path\Output>(if defined nodubs[12345] echo 12345, !nodubs[12345]! ) C:\Path\Output>(if defined nodubs[12245] echo 12245, !nodubs[12245]! ) C:\Path\Output>(if defined nodubs[16532] echo 16532, !nodubs[16532]! )
    • 你可以去掉包围for和redirect的括号,即将(for ... )) > new2017.txt改为for ... ),然后在echo %%a, ...行的末尾插入>>new2017.txtredirection。跨度>
    • 非常感谢!
    【解决方案2】:
    • 在批处理文件中的变量需要两个百分号。
    • %%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 的条目,而不是第二个 for,并用下划线括起来。
    • 如果没有找到在失败|| 时使用条件执行来写入新文件。

    【讨论】:

    • 对不起,我想我不清楚。我需要在新文件中附加路径和数字。这可以用你的方式归档吗?同样由于某种原因,%%a 给了我一个“%%a 在这个时候是意外的”错误。这就是我使用 %a 的原因(这似乎确实有效)
    • 请根据示例 nrs.txt 和 nodubstxt 编辑您的问题以包含所需输出的示例
    • 示例中使用的 %a%b 在批处理文件中不起作用,并且由于您的帖子被标记为批处理文件,因此 @LotPings 的使用是正确的。
    • @LotPings 添加了所需的输出。 @Compo 我用 windows CMD 运行了测试,我刚刚了解到你不能在那里使用 %%A。我的道歉
    【解决方案3】:

    根据更改的初步答案另一个答案。

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多