我有一个批处理文件
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