2013-01-10 26 views
6

Tôi đã viết một tập tin batch để thực hiện như sau:của Windows tập tin thực thi chỉ giữ lại những 30 file cuối cùng

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= 

Tôi lưu các tập tin như %1 và ngày/giờ tập tin được tạo ra:

SSS_20130110133304.ZIP 
SSS_20130110133336.ZIP 

Tôi đang chạy tính năng này trong trình lập lịch tác vụ để chạy mỗi tối.

Tôi muốn giữ không cho quá nhiều tệp zip trong thư mục vì vậy tôi muốn giữ 30 tệp zip cuối cùng tồn tại.

Tôi bị kẹt vào thời điểm này. Làm cách nào để giữ lại hầu hết các tệp zip RECENT 30 để tôi không bị tải tệp zip?

+0

+1 để thực hiện 99% công việc/trình bày một câu hỏi rõ ràng. –

Trả lời

10

Điều này sẽ liệt kê các tệp .zip từ mới nhất đến cũ nhất (theo ngày tạo), bỏ qua 30 tệp đầu tiên.

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

Chỉ cần thay đổi echo-del khi bạn muốn thực sự xóa các tập tin. :)

+0

+1 để đặt lệnh 'dir' trong'() '. –

+0

Tôi chạy lệnh của bạn trên các tệp '.txt' 99 của tôi (' for/f "skip = 30 delims ="% i in ('dir/ad/b/od/tc * .txt^2 ^> nul') del% i'), và nó đã xóa 1-39 và 70-99, để lại 40.txt - 69.txt. Hai lần tiếp theo tôi đã thử nó, nó hoạt động tốt. Rất kỳ quặc! –

+0

Cảm ơn sự giúp đỡ của bạn! – ErocM

3

Chỉ cần tập trung vào câu hỏi - làm thế nào để giữ cho 30 tác phẩm gần đây nhất, và xóa phần còn lại:

Bạn có thể làm một dir > clean.lst với loại thích hợp, do đó các tập tin gần đây nhất là tại đầu của clean.lst. Sau đó, bạn có thể sử dụng lệnh for để bỏ qua 30 dòng đầu tiên trong tệp và xóa các tệp được liệt kê sau tệp 30.

Hãy xem xét trường hợp thử nghiệm này:

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 

Bây giờ bạn có 99 tập tin văn bản trong thư mục XYZ.

Bạn có thể loại bỏ tất cả nhưng 30 gần đây nhất như thế này:

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 

Một dir chỉ hiển thị các tập tin văn bản 70.txt - 99.txt vẫn còn, phần còn lại đã được gỡ bỏ.

Đối với tập tin thực thi của bạn, tôi nghĩ rằng nó sẽ giống như thế này:

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 
+1

làm cách nào để kết hợp% BKUPDIR% với dấu? Tôi đang gặp sự cố khi làm việc đó một cách chính xác. – ErocM

+0

đã chỉnh sửa câu trả lời của tôi với ví dụ về tình huống của bạn ... –

+0

ví dụ của bạn thật tuyệt vời, tôi vừa mới xảy ra câu trả lời của anh ấy trước tiên. Cả hai đều làm việc vì vậy tôi đã cho bạn một +1. Cảm ơn bạn vì sự giúp đỡ! Điều này mang lại cho tôi một vài ý tưởng cho những thay đổi với những gì tôi hiện có. – ErocM

Các vấn đề liên quan