我有2个文件:tempfile.txt和mainfile.txt。我想解析tempfile并检查其中的字符串是否存在于mainfile中。如果他们这样做,我想将字符串放入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的内容以及应该包含的内容。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
答案 0 :(得分:1)
作为一种选择,并且仅基于您提供的内容,您应该可以在没有for-loop的情况下做到这一点:
FindStr /IG:"tempfile.txt" "mainfile.txt">"contain.txt"
FindStr /VIG:"mainfile.txt" "tempfile.txt">"dcontain.txt"
注意:
当您使用/G
时,文件第一行的内容确定搜索是以文字字符串还是正则表达式进行。显然,在您提供内容时,我认为无需明确告诉使用哪个内容,因为您的内容不包含正则表达式字符。因此,也许您应该使用/L
选项,只是为了确保也只使用/X
选项来进行完全匹配。要找出可用的选项,请打开“命令提示符”窗口,然后输入findstr /?
。
FindStr /XLIG:"tempfile.txt" "mainfile.txt">"contain.txt"
FindStr /XVLIG:"mainfile.txt" "tempfile.txt">"dcontain.txt"
答案 1 :(得分:0)
批处理是一种挑剔的野兽,您执行此操作的方式存在一些细微的问题。 %ERRORLEVEL%扩展在DO块中的解析时发生,因此仅被评估一次,并且不会像预期的那样得到0和1。
设置enabledelayedexpansion
可以帮助您。在检查是否相等时,EQU
和NEQ
是“数字”运算符,而==
将用于字符串比较。
如果您按以下方式进行更改,则可以使代码正常工作:
@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
)
)