Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件仅保留最后30个文件_Windows_Batch File - Fatal编程技术网

Windows批处理文件仅保留最后30个文件

Windows批处理文件仅保留最后30个文件,windows,batch-file,Windows,Batch File,我编写了一个批处理文件,该文件执行以下操作: REM @ECHO OFF rem %1 = coid rem %2 = rpg location with ending / rem get the path of this cmd script SET SUBDIR=%~dp0 SET BKUPDIR=%SUBDIR%BACKUPS\ SET LOGFILE=%BKUPDIR%backup.log ECHO *****************************************

我编写了一个批处理文件,该文件执行以下操作:

REM @ECHO OFF
rem %1 = coid
rem %2 = rpg location with ending /

rem get the path of this cmd script
SET SUBDIR=%~dp0

SET BKUPDIR=%SUBDIR%BACKUPS\
SET LOGFILE=%BKUPDIR%backup.log

ECHO ************************************************* >>%LOGFILE%
ECHO STARTING BACKUP FOR %1 AT %2 >>%LOGFILE%

FOR /f "skip=1" %%x in ('wmic os get localdatetime') DO IF NOT defined mydate SET mydate=%%x
SET filedate=%mydate:~0,14%
SET fullname=%BKUPDIR%%1_%FILEDATE%.ZIP

ECHO BKUPDIR: %BKUPDIR% >>%LOGFILE%
ECHO mydate: %mydate% >>%LOGFILE%
ECHO filedate: %filedate% >>%LOGFILE%
ECHO fullname: %fullname% >>%LOGFILE%
ECHO SUBDIR: %SUBDIR% >>%LOGFILE%

rem lets make sure the backup directory exists before starting
IF NOT EXIST %BKUPDIR% MD %BKUPDIR% >>%LOGFILE%

%SUBDIR%7z a -tzip %fullname%  %2%1*.d
IF ERRORLEVEL 255 ECHO user_stopped_the_process >>%LOGFILE%
IF ERRORLEVEL 8 ECHO not_enough_memory >>%LOGFILE%
IF ERRORLEVEL 7 ECHO command_line_error >>%LOGFILE%
IF ERRORLEVEL 2 ECHO fatal_error >>%LOGFILE%
IF ERRORLEVEL 1 ECHO ok_warnings >>%LOGFILE%

IF ERRORLEVEL 0 GOTO END
IF EXIST %fullname% DEL %fullname%

:END
ECHO FINISHING BACKUP FOR %1 >>%LOGFILE%
ECHO ************************************************* >>%LOGFILE%
set mydate=
我正在将文件保存为
%1
和文件创建的日期/时间:

SSS_20130110133304.ZIP 
SSS_20130110133336.ZIP
我在任务调度程序中运行此命令,以便每晚运行

我不想在目录中有太多的zip文件,所以我想保留存在的最后30个zip文件


我被困在这一点上了。如何保存最新的30个zip文件,这样我就不会有一堆垃圾zip文件了?

这将列出从最新到最旧的.zip文件(按创建日期),跳过前30个文件

for /f "skip=30 delims=" %%A in ('dir /a:-d /b /o:-d /t:c *.zip ^2^>nul') do if exist "%%~fA" echo "%%~fA"

当您想要实际删除文件时,只需将
echo
更改为
del
:)

只关注一个问题——如何保留30个最新文件,并删除其余文件:

您可以使用适当的排序执行
dir>clean.lst
,以便最新的文件位于
clean.lst
的开头。然后,您可以使用
for
命令跳过文件中的前30行,并删除第30行之后列出的文件

考虑这个测试用例:

C:>md xyz
C:>cd xyz
c:\xyz>copy con genfiles.bat
@echo off
set _i=1
:loop
if %_i%==100 goto :EOF
echo.>%_i%.txt
set /a _i+=1
goto loop
^Z
        1 file(s) copied.

c:\xyz>genfiles
c:\xyz>del genfiles.bat
现在,XYZ文件夹中有99个文本文件

您可以删除除最近30个之外的所有内容,如下所示:

C:\xyz>dir /b /o-d *.txt > clean.lst
C:\xyz>for /f "skip=30 delims=" %i in (clean.lst) do del "%i"
C:\xyz>del clean.lst
cd /d %BKUPDIR%
dir /b /o-d *.zip > clean.lst
for /f "skip=30 delims=" %%i in (clean.lst) do del "%%i"
del clean.lst
dir
仅显示文本文件70.txt-99.txt保留,其余已删除

对于您的批处理文件,我认为它应该如下所示:

C:\xyz>dir /b /o-d *.txt > clean.lst
C:\xyz>for /f "skip=30 delims=" %i in (clean.lst) do del "%i"
C:\xyz>del clean.lst
cd /d %BKUPDIR%
dir /b /o-d *.zip > clean.lst
for /f "skip=30 delims=" %%i in (clean.lst) do del "%%i"
del clean.lst

+我在我的99
.txt
文件(
for/f“skip=30 delims=“%I in('dir/a-d/b/o-d/tc*.txt^2^>nul')上运行了你的命令,删除了1-39和70-99,剩下40.txt-69.txt。接下来我试了两次,效果很好。非常奇怪!重要的是要注意,如果要直接在终端上(批处理文件外部)运行此命令,必须将所有“%%”替换为“%”。如何将%BKUPDIR%合并到del中?你的例子很好,我只是碰巧先得到了他的答案。他们都成功了,所以我给了你+1。谢谢你的帮助!这给了我一些改变我目前拥有的东西的想法。