将文件名与.bat进行比较,并将缺少的条目写入.txt

时间:2017-06-07 13:31:30

标签: batch-file compare filenames

我想比较文件夹中的某些文件,然后将缺少的文件写入文本文件。

我有一个文件夹

  

C:\会话\

包含文件。这些文件看起来像:

Blabla-1111-FOO
Blabla-1111-BAR1
Bleble-2222-FOO
Bleble-2222-BAR1
Bleble-2222-BAR2
Bleble-2222-BAR3
Bleble-2222-BAR4
Blublu-5678-FOO
Blublu-5678-BAR1
Blublu-5678-BAR2
Blublu-5678-BAR3
Blublu-5678-BAR4
Blublu-5678-BAR5
Bleble-6666-FOO
Bloblo-7777-FOO
Bloblo-8888-FOO
Bloblo-9999-FOO

我需要一个.bat文件,该文件将所有以-FOO结尾的文件写入noBARs.txt,其中不存在匹配的-BAR。所以在这种情况下,noBARs.txt应如下所示:

Bleble-6666-FOO
Bloblo-7777-FOO
Bloblo-8888-FOO
Bloblo-9999-FOO

可以有多个-BAR文件属于一个-FOO文件。 先谢谢你们。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

@echo off

setlocal enabledelayedexpansion
set "source=c:\sessions"
set "output=noBARs.txt"
set "find=*foo"
set "repl=bar*"

1>"%output%" (
  for %%e in ("%source%\%find%") do (
    set "file=%%e"
    if not exist "!file:~0,-3!%repl%" (
      echo %%~ne
    )
  )
)

这将遍历文件名中包含*foo的所有文件。然后用bar*替换文件名的最后3个字符,并检查文件是否存在。如果相应的bar文件不存在,它会将原始文件名写入输出文件noBARs.txt

我已根据dEEkAy的最后一条评论添加了该脚本的替代版本,其中他声明应该测试以FOO结尾的文件后跟数字常量。我还很不确定dEEkAy的确切意图是什么,但我假设文件名*FOO*的处理方式应与*FOO相同。

以下输入:

Blabla-1111-FOO
Blabla-1111-BAR1
Bleble-2222-FOO
Bleble-2222-BAR1
Bleble-2222-BAR5
Blublu-3333-FOO6
Blublu-3333-BAR1
Blublu-5678-FOO
Blublu-5678-FOO1
Blublu-5678-BAR2
Blublu-5678-BAR4
Bleble-6666-FOO
Bloblo-7777-FOO5
Bloblo-7777-BAR8
Bloblo-9999-FOO
Blublu-9999-FOO9
Bloblo-!^^!-FOO

将产生以下输出:

Bleble-6666-FOO
Bloblo-!^^!-FOO
Bloblo-9999-FOO
Blublu-9999-FOO9

该脚本的替代版本也比原始版本更强大。它现在应该能够适当地处理包含感叹号和插入符号的文件名和路径。不幸的是,它确实带来了成本。由于将为for循环的每次迭代执行call命令,脚本变得慢得多。也许拥有更多批处理文件脚本经验的人可以提出更好的解决方案。

@echo off

setlocal disabledelayedexpansion
set "source=c:\sessions"
set "output=noBARs.txt"
set "find=foo"
set "repl=bar"

1>"%output%" (
  for %%e in ("%source%\*%find%*") do (
    set "path=%%~dpe"
    set "file=%%~ne"

    setlocal enabledelayedexpansion
    call :ReplaceEndOfString file match "%find%" "%repl%"

    if not exist "!path!!match!*" (
      echo !file!
    )
    endlocal
  )
)
exit /b

:ReplaceEndOfString (__in *source, __out *dest, __in find, __in repl) {
  set "temp=!%1:*%~3=%~3!"
  set "%2=!%1:%temp%=%~4!"
  exit /b
}

请注意,"%source%\*%find%*"将匹配其文件名中包含%find%的任何文件,而"%source%\*%find%?"仅匹配以%find%结尾的文件名,包括一个可选字符这可能是任何事情。