Windows 命令 |拆分文件以包含和不包含其他文件

Windows Command | Split A File to Contain and Doesn't Contain By Other File

我有 2 个文件:tempfile.txt 和 mainfile.txt。我想解析临时文件并检查其中的字符串是否存在于主文件中。如果他们这样做,我想把字符串放在 contain.txt 中。如果不是,它们应该放在 dcontain.txt

当我 运行 下面的脚本时,dcontain.txt 文件没有被创建。相反,所有搜索字符串都以 contain.txt.

结尾
@echo off
for /f "tokens=1" %%a in (tempfile.txt) do (
findstr /m "%%a" mainfile.txt
if %errorlevel%==0 (
echo %%a>>contain.txt
)else (
echo %%a>>dcontain.txt
)
)

请看下面mainfile、tempfile的内容以及contain.txt和dcontain.txt应该包含的内容。最后一列是我看到的。

mainfile  tempfile   contain   dcontain |O|contain.txt
11111     11111      11111     aaaaa    |U|11111 
22222     aaaaa      22222     bbbbb    |T|aaaaa       
33333     22222      33333              |O|22222   
44444     bbbbb                         |U|bbbbb      
55555     33333                         |T|33333                        

批处理是一个挑剔的野兽,您执行此操作的方式存在一些微妙的问题。 %ERRORLEVEL% 扩展发生在 DO 块内的解析时,因此它仅被评估一次,您不会像预期的那样得到 0 和 1。

设置 enabledelayedexpansion 对此有所帮助。当您检查是否相等时,EQUNEQ 是 "numeric" 运算符,而 == 将用于字符串比较。

如果按如下方式更改代码,则可以使代码正常工作:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1" %%a in (tempfile.txt) do (
findstr /I "%%a" mainfile.txt >nul 2>&1

if ERRORLEVEL 1 (

    echo %%a>>dcontain.txt  

)else (

    echo %%a>>contain.txt   
)
)

作为替代方案,并且完全基于您提供的内容,您应该能够在没有 的情况下做到这一点:

FindStr /IG:"tempfile.txt" "mainfile.txt">"contain.txt"
FindStr /VIG:"mainfile.txt" "tempfile.txt">"dcontain.txt"

注意:
当您使用/G时,文件第一行的内容决定了搜索是作为文字字符串还是常规字符串执行表达式。显然,当您提供内容时,我认为没有必要特别告诉它使用哪个内容,因为您的内容不包含正则表达式字符。因此,也许您应该使用 /L 选项,并且只是为了确保完全匹配也只使用 /X 选项。要找出可用的选项,请打开命令提示符 window 并输入 findstr /?.

FindStr /XLIG:"tempfile.txt" "mainfile.txt">"contain.txt"
FindStr /XVLIG:"mainfile.txt" "tempfile.txt">"dcontain.txt"