Windows 批处理:使用CRC32比较文件

Windows 批处理:使用CRC32比较文件,windows,file,batch-file,compare,crc32,Windows,File,Batch File,Compare,Crc32,我给了自己一个简单的任务,编写一个批处理文件,该文件将执行以下操作: 比较“第一”文件夹中每个文件的CRC32与“第二”文件夹中每个文件的CRC32。输出需要是“first”文件夹中每个文件的名称,该文件夹在“second”中没有重复项 注意:“CRC32.exe-nf”在第一行输出CRC32,在第二行输出文件大小 下面是我如何尝试的: @echo off for %%i in ("%cd%\first\*.*") do ( set uniq=0 for /f %%x in (

我给了自己一个简单的任务,编写一个批处理文件,该文件将执行以下操作:

比较“第一”文件夹中每个文件的CRC32与“第二”文件夹中每个文件的CRC32。输出需要是“first”文件夹中每个文件的名称,该文件夹在“second”中没有重复项

注意:“CRC32.exe-nf”在第一行输出CRC32,在第二行输出文件大小

下面是我如何尝试的:

@echo off

for %%i in ("%cd%\first\*.*") do (
    set uniq=0
    for /f %%x in ('crc32 %%i -nf') do (
        set one=%%x
        goto find_two
    )
    :find_two
    for %%j in ("%cd%\second\*.*") do (
        for /f %%x in ('crc32 %%j -nf') do (
            set two=%%x
            goto compare
        )
        :compare
        if one==two (
            goto next
        ) else (
            set uniq=1
        )
    )
    if uniq==1 (
        echo %%i >>result.txt
    )
    :next
)
我假设这段代码中存在几个错误,但我很难找到它们。因此,如果有人有时间,并且认为他能帮助我,我将不胜感激


如果您认为需要不同的方法,请随意展示。

有两个主要问题

Goto的内部括号不能按预期工作,它们会立即停止循环,因此您的代码将在那里失败。
解决方法是避免
goto
或调用函数并在那里使用
goto

第二个问题是比较。
if one==two(
将始终为false,因为它将单词
one
与单词
two
进行比较,但不比较变量的内容

通常情况下,如果“%one%”==“two%”echo equal,您会使用
,但由于它应该在括号内工作,您需要延迟扩展,因此它看起来像

if !one!==!two! echo equal
在开始循环之前,不要忘记启用延迟扩展

setlocal EnableDelayedExpansion

使用以下内容可能更容易捕获crc32的输出:

for /f %%x in ('crc32 "%filename%" -nf ^| find /v "CRC32"') do stuff with %%x

如果没有帮助,你能告诉我一个例子CRC32的完整输出吗?< /P>我使用<代码> Goto 的唯一原因是因为C++中没有<代码>破解<代码>,但是我不知道它不仅会打破嵌套循环,而且所有这些都是。我已经根据你的指令修改了脚本,现在看起来像是是:。但我仍然得到与以前相同的错误:“)此时不是预期的。”感谢您的帮助jeb。多亏了你,我意识到打破嵌套循环是主要的问题,我四处搜索,找到了如何做到这一点。这就是代码现在的样子,它按预期工作: