批处理程序何时会转到下一行?

批处理程序何时会转到下一行?

我有一个批处理文件

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "my_date=%YYYY%%MM%%DD%" & set "time=%HH%%Min%"

set "minFiles=10"

setlocal EnableDelayedExpansion

rar a -t -rr D:\Backup\Arch\Backup_%_my_date%.rar D:\Backup\Backup.bak

for /f %%A in ('dir "D:\Backup\Arch\*.rar" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "D:\Backup\Arch\*.rar"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
pause
for /f %%A in ('dir "D:\Backup\Arch\*.rar" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop

它应该将一个文件压缩成 rar 文件,然后检查文件夹中是否有超过 10 个文件,然后删除最旧的文件。它工作正常,直到文件夹 D:\Backup\Arch\ 中有 10 个 rar 文件。但是,如果文件夹中有 10 个 rar 文件,我启动 *.bat,我会在 D:\Backup\Arch\ 中得到一个新的 rar 文件,现在有 11 个了。它应该转到下一行,如果有 11 个文件,则删除一个文件,但它没有删除。为什么?rar 需要 2 或 3 个小时。

当程序在这里时

rar a -t -rr D:\Backup\Arch\Backup_%_my_date%.rar D:\Backup\Backup.bak

并且它正在存档文件,什么时候转到下一行

for /f %%A in ('dir "D:\Backup\Arch\*.rar" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof

rar 完成后或发送 rar 命令后立即执行?如何让程序在 rar 完成后立即转到下一行?

如果我使用这部分代码启动另一个 bat,它会完美运行并删除文件

for /f %%A in ('dir "D:\Backup\Arch\*.rar" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "D:\Backup\Arch\*.rar"') do (
    del "%%a"
    goto :breakLoop
    )
:breakLoop
pause
for /f %%A in ('dir "D:\Backup\Arch\*.rar" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop

答案1

根据我的评论,我建议:

  • 使用 for /f 和 skip 选项
  • 并解析按名称反向排序的目录输出 dir /B /A-D /O-N
  • 顺便说一句,你创建了一个变量my_date,但试图使用不存在的%_my_date%

:: Q:\Test\2019\06\14\SU_1448654.cmd
@Echo off & setlocal EnableDelayedExpansion
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "my_date=%dt:~0,8%
set "minFiles=10"

rar a -t -rr D:\Backup\Arch\Backup_%my_date%.rar D:\Backup\Backup.bak

for /f "skip=%minFiles% delims=" %%a in ('dir /B /A-d /O-N "D:\Backup\Arch\Backup_*.rar"') do (
    Echo del "%%a"
)
pause

如果输出看起来正常,请删除命令Echo前面的del

相关内容