Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在批处理脚本中比较两个文件_Batch File_File Comparison - Fatal编程技术网

Batch file 在批处理脚本中比较两个文件

Batch file 在批处理脚本中比较两个文件,batch-file,file-comparison,Batch File,File Comparison,我试着以这样的方式比较两个文件,文件1的每一行将与文件2的每一行进行比较,如果没有找到匹配项,则将该行写入一个单独的文件 下面是我写的代码,但它没有按预期工作 @echo on cd path for /f %%a in (file1.txt) do ( for /f %%b in (file2.txt) do ( if %%a==%%b ( echo lines are same ) else ( echo %%a >> file3.txt ) ) ) 我得到一个错误,命令的语法

我试着以这样的方式比较两个文件,文件1的每一行将与文件2的每一行进行比较,如果没有找到匹配项,则将该行写入一个单独的文件

下面是我写的代码,但它没有按预期工作

@echo on
cd path
for /f %%a in (file1.txt) do (
for /f %%b in (file2.txt) do (
if %%a==%%b
(
echo lines are same
) else (
echo %%a >> file3.txt
)
)
)
我得到一个错误,命令的语法不正确。
请帮我解决这个问题。

语法错误是由错误放置的左括号引起的,但即使这样,代码也不能按预期工作

您可以将file1中的每一行与file2中的每一行进行比较,但您可以为每一个不相等的比较进行输出,而不仅仅是在没有找到匹配项时

for /f %%a in (file1.txt) do (
    set "matchFound="
    for /f %%b in (file2.txt) do (
        if %%a==%%b (
            echo lines are same
            set matchFound=1
        )
    )

    if not defined matchFound (
        echo %%a is not found in file2
    )
)
试一试:

@echo on
cd /d "c:\path"
del file3.txt 2>nul
for /f "delims=" %%a in (file1.txt) do (
   set "flag="
     for /f "delims=" %%b in (file2.txt) do (
       if "%%a"=="%%b" set flag=1
     )
   if not defined flag >>file3.txt echo %%a
)
如果您的文件很大并且需要速度,那么为file2的内容设置一个数组将显著加快速度

这也可以使用更简单的代码,但取决于file1的内容

@echo on
cd /d "c:\path"
del file3.txt 2>nul
for /f "delims=" %%a in (file1.txt) do (
     findstr "^%%a$" file2.txt >nul || >>file3.txt echo %%a
)

foxidrive显示的FINDSTR方法无疑是解决问题的最快的纯批处理方法,尤其是在file2很大的情况下。但是,有许多情况可能导致它失败:文件1中的regex元字符、文件1中的引号和/或反斜杠等。有关所有潜在问题,请参阅。多做一点工作可以使解决方案更可靠

  • 搜索应显式设置为文本
  • 搜索应完全匹配(整行)
  • 搜索行中的任何反斜杠都应转义为
    \\
  • 每次搜索都应存储在临时文件中,并使用
    \G:file
    选项
此外,您没有描述每行的格式。由于
的默认
delims
选项,FOR/F语句将只读取每行的第一个单词。我怀疑你想把delims设置为nothing。您还希望禁用
eol
选项,以便以
开头的行不会被跳过。这需要一些奇怪的语法。我添加了
usebackq
选项,以防处理必须引用的文件名

@echo off
setlocal disableDelayedExpansion
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"

>"%file3%" (
  for /f usebackq^ delims^=^ eol^= %%A in ("%file1%") do if "%%A" neq "" (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    (echo(!ln:\=\\!) >"%search%"
    findstr /lxg:"%search%" "%file2%" >nul || (echo(!ln!)
    endlocal
  )
)
del "%search%" 2>nul
如果您的文件2不包含
\“
,并且您可以进行不区分大小写的搜索,则有一种非常快速的单行解决方案:只需反转FINDSTR搜索,查找文件1中不存在于文件2中的任何行。由于存在大小写差异,搜索必须不区分大小写

如果由于转义问题,文件2包含
\“
,则此操作将不起作用。您可以预处理file2并转义所有
\
,但是如果您将自己限制为纯批处理解决方案,那么您也可以使用第一个解决方案

如果您愿意使用,那么我有一个非常简单有效的解决方案。BAT对stdin的每一行执行regex搜索和替换操作,并将结果写入stdout

假设REPL.BAT在您当前的目录中,或者更好地说,在您的路径中的某个地方:

@echo off
setlocal
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"

type "%file2%"|repl \\ \\ >"%search%"
findstr /livxg:"%search%" "%file1%" >"%file3%"
del "%search%" 2>nul

请注意,此解决方案仍然必须执行不区分大小写的比较。

为什么不使用
FC
命令?从帮助
IF/?
中,括号必须在同一行<代码>如果%%a==%%b(
@npocmaka-FC命令不会给出OP所需的输出。它还依赖于行顺序,因此完全不适合此问题。
@echo off
setlocal
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"

type "%file2%"|repl \\ \\ >"%search%"
findstr /livxg:"%search%" "%file1%" >"%file3%"
del "%search%" 2>nul