【问题标题】:FOR loop every file in folder and perform COMP + MOVE in BAT fileFOR循环文件夹中的每个文件并在BAT文件中执行COMP + MOVE
【发布时间】:2014-11-06 21:50:42
【问题描述】:

我有 2 个文件夹(目录 A 和目录 B),其中包含 .csv 文件形式的相同财务报告,但具有可能不同的值。

我正在尝试通过删除相同的报告来协调这些报告,但我也在尝试编写一个执行比较的.bat 文件,此外,根据 if 将相应的文件转移到其他文件夹该特定文件是否存在差异。

我希望 .bat 文件:

  1. 遍历目录 A 中的每个文件
  2. 对于每个文件,将其与目录 B 中的对应文件进行比较 (COMP)(文件名将相同)
  3. 如果没有差异 - 将文件分别从目录 A 和目录 B 移动 (MOVE) 到目录 C 和目录 D。
  4. 如果存在差异 - 什么也不做;将文件留在目录 A 和 B 中,然后继续循环

我的程序看起来有点像这样(显然不完整):

@echo off
:Main
FOR /D %%X ("C:\youl\dirA") DO COMP %%X C:\youl\dirB
IF ERRORLEVEL 0 GOTO Next1

:Next1
Copy C:\youl\dirA C:\youl\dirB 

显然,就我的目的而言,这是一段非常可怕且无法操作的代码。

任何帮助将不胜感激!

从 npocmaka 的代码更新:

@echo off

Setlocal enableDelayedExpansion 
set "dirA=c:\users\youl\automation\binarycheck\A\*.csv"
set "dirB=c:\users\youl\automation\binarycheck\B\*.csv"
set "dirC=c:\users\youl\automation\binarycheck\C\"

for /f "tokens=* delims=" &&a in ("%dirA&") do (
        fc /b "%%a" "%dirB%" >nul 2>&1 && (
            move "%%a" "%dirC%"
        )
)

endlocal

【问题讨论】:

  • 你要递归遍历还是平面遍历?
  • for %%g in ("C:\youl\dirA\*.csv") do @echo %%g开始,查看结果,然后learnFOR(在FOR循环中运行多个命令),learnIF condition (commands) ELSE (commands)learn@@ 987654334@, learn ...
  • 我自己也在尝试解决这个问题,但我没有完全的时间特权,因为我需要很快找到解决方案。我可以让 FOR 循环工作,这是我的条件“MOVE”被破坏,因为它将整个程序视为一个(即文件集)而不是查看每个文件级别的 ERRORLEVEL。因此,要么我的所有文件都被移动,要么没有,这不是我想要完成的。
  • 不确定 npocmaka - 实际上它都在同一个驱动器上。抱歉,在引用 dir A 和 dir B 时,我应该更清楚地说我是在谈论简单的 Windows 文件夹
  • 您的errorlevel 问题很简单。 if errorlevel n 表示如果错误级别为 n 或大于 n。因此if errorlevel 0 是,除非在特殊情况下,总是正确的。要测试 0,请使用 if not errorlevel 1

标签: windows loops batch-file compare


【解决方案1】:

未经测试!

@echo off

setlocal enableDelayedExpansion
set "dirA=c:\dir1"
set "dirB=c:\dir2"

for /f "tokens=* delims=" %%a in ('dir /b /s /a:-d "%dirA%"') do (
        set "path1=%%~pa"
        set "path2=!path1:%dirA%=%dirB%!"
        fc /b "%%~fa" "%%~da!path2!%%~nxa" >nul 2>&1 && (
            move "%%~fa" "%%~da!path2!%%~nxa"
        )
)

endlocal

假设您需要递归检查并且dirAdirB 在同一个驱动器上...

【讨论】:

  • 非常感谢 - 但看起来你已经包含了 FC,而我真的可能正在寻找 COMP。此外,作为“MOVE”功能的一部分,文件被移动到哪里对我来说并不完全清楚。
  • @Youl - 为什么你需要明确的COMP 命令? COMP 将需要通过管道传输 echo n 以停止提示进行另一次比较...
  • 如果我错了,请纠正我,但FC不只是检查文件的大小吗?我想避免出现两个文件大小相同但数据中的值不同的情况——如果这有意义的话。但是,即使使用 FC,我也不清楚当这个程序相对于 MOVE 执行时会发生什么。我相信它会遍历文件夹 A 中的每个文件,并将其与文件夹 B 中的对应文件进行比较。但不确定如果文件匹配或不匹配会发生什么,逻辑在说什么。非常感谢您的帮助
  • ss64.com/nt/fc.html - 大小只是 FC 检查的第一件事。它比 COMP 更高级的命令
  • 我明白你的意思 npocmaka,在那种情况下,FC 就可以了。我已经获取了您的代码并对其进行了一些更改,以查看是否可以使其正常工作,因为它并不完全适合我。它几乎处于一个很好的阶段,除了它在整个文件夹中应用 MOVE 逻辑,而不是一个文件一个文件。如果所有文件都没有差异,则将它们移动到新文件夹。但是,如果只有 1 个文件有差异,则所有文件都会保留,而实际上我希望移动有差异的 1 个文件。我会更新主帖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2012-04-25
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多