Batch file Windows命令|拆分文件以包含和不包含';不包含其他文件

Batch file Windows命令|拆分文件以包含和不包含';不包含其他文件,batch-file,cmd,compare,findstr,for-loop,Batch File,Cmd,Compare,Findstr,For Loop,我有两个文件: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" ma

我有两个文件: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                        

批处理是一个挑剔的野兽,在你这样做的过程中有几个微妙的问题ERRORLEVEL%扩展发生在DO块内的分析时,因此只对其求值一次,并且不会得到预期的0和1

设置
enabledelayedexpansion
有助于实现这一点。检查相等性时,
eq
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   
)
)

作为一种选择,并且完全基于您提供的内容,您应该能够做到这一点,而无需:

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”

您使用的是土耳其语字符,因此可以使用@来称呼您。另外,这个问题很难理解它的提出方式,但包含文件内容对于理解您的意图很有用。请尝试以下操作:
findstr/M/C:%%a“mainfile.txt”>nul&&(>>“contain.txt”echo(%%a)|(>>“dcontain.txt”echo(%%a)
…谢谢@Adilhindtan!它成功了!我尝试了许多不同的方法,但我从未想过enabledelayedexpansion:)嗯,可能是因为我是批处理的新手:D再次感谢!它在小文件上工作,但我有两个大的txt文件,我无法得到结果。主文件有10k行。临时文件有2k行。当解析dcontain.txt@adilhindtan@İzzettinAlpaslan时,主文件中包含一些字符串,那么您没有正确复制上述代码,或者您没有使用与您的问题中提供的文件内容相同,我非常清楚地指出,“完全基于您提供的内容”@İzzettinAlpaslan,我已经在我的答案的底部添加了一个注释,看看它是否对您有进一步的帮助。哦,请不要接受答案,然后评论说,如果不删除该接受,它对您不起作用。包括回答者在内的任何人都不会觉得有必要向您提供您需要的进一步帮助。还希望您的文件重新正确终止(底部有空行)。