我想比较文件夹中的某些文件,然后将缺少的文件写入文本文件。
我有一个文件夹
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文件。 先谢谢你们。
答案 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%
结尾的文件名,包括一个可选字符这可能是任何事情。