Batch file 比较批处理文件中相同文件的大小

Batch file 比较批处理文件中相同文件的大小,batch-file,Batch File,我有一个任务,其中有一个文件开始通过DB生成,并花了将近1个小时生成,有一个批处理文件检查此文件,每当它可用时,它调用一个新的批处理文件并触发“已发送文件”,问题是,这个正在连续生成的文件并不是完全生成的,而是在选择相同的文件并调用批处理文件时生成的 我想构建一个逻辑,在这个逻辑中,我可以将循环中的文件大小与2个变量sizeA和sizeB进行比较,并在sizeA==sizeB时调用另一个批处理文件。现在唯一的问题是我不确定如何在代码中构建这个逻辑\ 以下是我尝试过的: @echo off set

我有一个任务,其中有一个文件开始通过DB生成,并花了将近1个小时生成,有一个批处理文件检查此文件,每当它可用时,它调用一个新的批处理文件并触发“已发送文件”,问题是,这个正在连续生成的文件并不是完全生成的,而是在选择相同的文件并调用批处理文件时生成的

我想构建一个逻辑,在这个逻辑中,我可以将循环中的文件大小与2个变量sizeA和sizeB进行比较,并在sizeA==sizeB时调用另一个批处理文件。现在唯一的问题是我不确定如何在代码中构建这个逻辑\

以下是我尝试过的:

@echo off
setlocal EnableDelayedExpansion
set file = "C:\Users\rb54761\Desktop\New folder\File.txt"
set "size=0"
pause
:loop for /f "tokens=*" %%x in ('dir /s /a /b "%file%"2^>nul') do set /a size=%%~zx
echo !size!
PAUSE
if !size! == !size! goto call
goto loop 
:call echo Success
编辑我现在只看到你的评论是一个2gb的文件,那么下面的代码将无法工作

如果文件要更小..下面是一个示例:

@echo off
set "myfile=C:\Users\rb54761\Desktop\New folder\File.txt"
:start
for /f %%I in ("%myfile%") do set size=%%~zI
if %size% LSS 100 (echo file not ready %size% & timeout /t 10 & goto :start)
echo copy file.
如上所述,它将检查文件大小是否为100kb,如果尚未达到该大小,它将超时10秒,转到开头并再次测试,直到文件达到100kb,此时它将不再满足if语句并通过该行,只需回显
复制文件


请注意,“我的集合”命令中没有空格。我建议您从cmd运行help
获取/?
以了解有关此命令的更多信息。

我们可以使用以下方法在一段时间内比较同一文件的大小

@echo off
setlocal EnableDelayedExpansion
set file="d:\File_Mask1\New_File\File.txt"
set "size=0"

If exist %file% GOTO loop
GOTO nofile

:loop
for /f "tokens=*" %%x in ('dir /s /a /b %file%') do set /a size=%%~zx
echo !size!

waitfor SomethingThatIsNeverHappening /T 120 >nul 2>&1

for /f "tokens=*" %%y in ('dir /s /a /b %file%') do set /a size1=%%~zy
echo !size1!
if !size! EQU !size1! goto call
goto loop

:call
echo Success
endlocal

这将利用存档属性。Windows每次写入文件时都会设置此属性。 因此,如果我们可以取消设置它,请等待一段时间并检查它(我使用
dir/aa
,当属性未设置时,它将找不到文件)

(注意:您的
设置文件=…
行是错误的。
=
周围的空格将成为变量名和相应值的一部分)


优点:没有文件大小限制(大于2GB的文件也可以处理)

文件有多大?@GerhardBarnard约2 GB您尝试过什么,卡在哪里?请分享一个@echo off setlocal enabledayedexpansion set file=“C:\Users\rb54761\Desktop\New folder\file.txt”set“size=0”pause:loop for/f“tokens=*”%%x in('dir/s/a/b”%file%%“2^>nul”)do set/a size=%%~zx echo!尺寸!如果需要,请暂停!大小!==!尺寸!转到呼叫转到循环:呼叫回显Success@GerhardBarnard,感谢您添加代码;我撤回了最后一票。不过,我希望OP下次自己能做到这一点(他现在已经成为会员两年多了,应该知道如何提问)……waitfor不是你想在这里使用的东西。在任何情况下,您可能在将来使用errorlevel,它将导致errorlevel为1,虽然这里不是这样,但有一个batter方法。如果@GerhardBarnard我试图使用timeout/T,但当我通过Autosys运行批处理时,批处理抛出错误“错误:不支持输入重定向,立即退出进程”,则在决定信任您的
之前,您应该阅读并链接问题这就是我使用Waitfor的原因
@echo off
set sec=10
set "file="C:\Users\rb54761\Desktop\New folder\File.txt""
set /a secs=sec+1
:loop
  attrib -a "%file%"
  timeout %sec% >nul
  dir /b /aa "%file%" >nul 2>&1 || goto :loop
echo %file% didn't change since %secs% seconds