7

次の処理を行うバッチ ファイルを作成しました。

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 ファイルのがらくたの負荷にならないようにするにはどうすればよいですか?

4

2 に答える 2

11

これにより、最初の 30 個のファイルをスキップして、.zip ファイルが新しいものから古いもの (作成日順) に一覧表示されます。

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:)

于 2013-01-10T20:56:47.093 に答える
4

質問に焦点を当てるだけです-最新の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

Adirはテキスト ファイル 70.txt ~ 99.txt のみが残り、残りは削除されていることを示しています。

バッチファイルの場合、次のようになると思います。

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
于 2013-01-10T21:03:40.360 に答える