0

次のバッチ ファイルを使用して、Windows Server マシン上の特定のディレクトリを長い間バックアップしてきました。バッチ ファイルは、Windows のスケジュールされたタスクによって毎日特定の時刻に実行され、最も古い .7z ファイル (7z = www.7-zip.org) を削除した後、特定のフォルダーをバックアップ場所に圧縮します。

このようにして、バックアップ フォルダの BackupNr で指定された数の .7z ファイルしか保持できず、最も古い .7z ファイルを手動で削除する必要がなくなります。

問題は「Set BackupNr=1」行です。BackupNr=1 を使用すると、バッチ ファイルの実行後、常に 2 つの .7z アーカイブがバックアップ フォルダーに保存されます。

バッチ ファイルが実行されるたびに 1 つのアーカイブのみが保持されるように、何を変更する必要があるかわかりません。どうすればこれを修正できますか?

@echo off

:: The name of the backup file that will be created. It will use the current date as the file name.
@For /F "tokens=1,2,3,4 delims=/ " %%A in ('Date /t') do @(
    Set FileName=%%A%%B%%C%%D
)

:: The name of the folders where all the backup .zip and report files will be stored.
Set ArchiveFolder=D:\Backup\Manual\Archives
Set ReportFolder=D:\Backup\Manual\Reports

:: The name of the folder that will be backed up, i.e. the AppData folder.
Set FolderToBackup=C:\AppData

:: The number of .zip files and .txt reports to keep. Older archives will be deleted according to their age. This ensures we only keep the most recent X number of backups.
Set BackupNr=1

:: Delete oldest backup archives so we only keep the number of archives specified in "skip=".
echo.>> DeletedBackups.txt
date /t >> DeletedBackups.txt
echo.>> DeletedBackups.txt
echo These older backups were deleted:>> DeletedBackups.txt
for /F "skip=%BackupNr% delims=" %%a in ('dir /b /o-d %ArchiveFolder%\*') do (
    echo %ArchiveFolder%\%%a%1>> DeletedBackups.txt
    del /f /q %ArchiveFolder%\%%a%1
)

echo.>> DeletedBackups.txt
echo These older reports were deleted:>> DeletedBackups.txt
for /F "skip=%BackupNr% delims=" %%a in ('dir /b /o-d %ReportFolder%\*') do (
    echo %ReportFolder%\%%a%1>> DeletedBackups.txt
    del /f /q %ReportFolder%\%%a%1
)

echo Starting the backup: %DATE% %TIME% >> %ReportFolder%\%FileName%.txt

:: Adds all files to 7z archive using BCJ2 converter, LZMA with 8 MB dictionary for main output stream (s0), and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.
C:\PROGRA~1\7-Zip\7z.exe a -t7z %ArchiveFolder%\%FileName%.7z %FolderToBackup%\* -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3 >> %ReportFolder%\%FileName%.txt

echo Backup finished at: %DATE% %TIME% >> %ReportFolder%\%FileName%.txt

:: Write the backup Start and End times to the BackupInfo.csv file.
gawk -f BackupRecord.awk %ReportFolder%\%FileName%.txt >> %ReportFolder%\BackupReport.csv

:: Write the file size of the backup .zip file that was just created to the log file.
set size=0
call :filesize %ArchiveFolder%\%FileName%.7z
echo Backup archive file size: %size% bytes >> %ReportFolder%\%FileName%.txt

exit

:: set filesize of 1st argument in %size% variable, and return
:filesize
  set size=%~z1
  exit /b 0

ありがとう。

4

1 に答える 1

1

dir コマンドの /b スイッチは、ヘッダーもサマリーも使用しません。結果は、アーカイブの単純なリストです。この場合、順序付けは作成時間の降順で、最新のものが最初になります。

問題はskip=%BackupNr%です

for /F "skip=%BackupNr% delims=" %%a in ('dir /b /o-d %ReportFolder%\*') do (
  echo %ReportFolder%\%%a%1>> DeletedBackups.txt
  del /f /q %ReportFolder%\%%a%1
)

最初の行をスキップするので、delete コマンドは最新のものを除くすべてのアーカイブを消去します。

次にバックアップを実行すると、新しいファイルがディレクトリに追加されます。結果、2 つのファイル。

最後の 1 つだけが必要な場合は、最初にバックアップを実行してから削除するか、for コマンドからskip=%BackupNr%を削除する必要があります。

于 2016-06-01T11:08:46.300 に答える