web-dev-qa-db-ja.com

7-Zip CMD:現在の日付をアーカイブに追加し、最後に変更されたフォルダーのみをアーカイブに含めます

7-Zip を使用してバックアップスクリプトを作成しようとしています。私は他のすべてをすでに行っていますが、これらの2つの問題はまだ私を妨げています。

まず、次のような作成日のタイムスタンプを追加します:3.11.2010 Backup.7z

したがって、dd.mm.yyyy フォーマット。 Internnetで見つけたいくつかのバージョンを試しましたが、これらのどれも私が望むように機能しませんでした。私は何をすべきか?

次に、最後に変更されたフォルダのみをアーカイブに追加します(ディレクトリにフォルダがいくつあっても、最新のものが必要です)。基本的に、私はこのようなものを持っています:

App_v.1.0.0.4.exe_Url_2um2yok5q4vpoxnvnscpq3adfwff4wsmi
App_v.1.0.0.5.exe_Url_ft4mnvbu54hfrgdhxrahj4imlmermdsoe

したがって、最新の(1.0.0.5)フォルダーのみを追加します。これらのフォルダーは変更され、常に異なる名前が付けられるため、名前ベースの並べ替えはお勧めできません。

8
TMRW
7z a -r "%DATE:~7,2%.%DATE:~4,2%.%DATE:~-4% Backup".7z

DD.MM.YYYY Backup.7z形式でアーカイブを作成します。

説明:%DATE%をエコーすると、地域の日付形式設定で日付が出力されます。

D:\>echo %DATE%
Thu 11/04/2010

~x,y指定子を使用して、文字列の文字列/部分文字列の抽出を行っています。ここで、xは開始文字で、yは抽出する文字数です。

2番目のポイント:

最後に変更したフォルダをアーカイブに追加したいだけです(ディレクトリにいくつのフォルダが存在していても、最新のものが必要です)。

7z u -r "%DATE:~2,2%.%DATE:~5,2%.%DATE:~-4% Backup".7z 

それを行う必要があります。

7Zip date

8
Sathyajith Bhat

「ウィンドウ管理計装」を使用できます。 これを見てください

test1.bat

set mydate=
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
echo Current date is %mydate%

結果:

現在の日付は20140202145547.557000 + 060です

「コントロールパネル」の「地域設定」(日付形式)に関係なく、常にYYYYMMDDを返します。

1
vlakov

7Zipコマンドラインには、必要なタスクを実行するロジックがありません。 Linuxを実行している場合は、シェルスクリプトでこれを行う方法を理解する必要があります。 Windowsを使用している場合は、DOSバッチ言語(十分に強力な場合があります)、Powershell(何かをインストールする必要がある)を試すか、vbscript(.vbs)ファイルを作成することができます。これは非常に優れたソリューションです。

Vbsルートを使用する場合は、vbscriptでfilesystemobjectを使用することを検討することをお勧めします。 http://www.devguru.com/technologies/vbscript/14048.asp

0
NoCarrier

その日に変更されたファイルを取得するために私が行ったのは、Robocopyを使用して、新しく変更されたファイルを一時ディレクトリにコピーし、それを7Zipすることでした。

編集:
外出先から、私はバッチスクリプトの忍者ではないと言いたいのですが、ウェブサイトを読んで、十分に機能しているように見えるものをまとめることができました。私はプログラマーではありませんが、私は「コンピューターの男」なので、私が仕事をしているほとんどの人よりも知っています。

これがスクリプト[〜#〜] i [〜#〜]の使用方法です。日付の形式は要求したものとは異なります。YYYY-MM-DDを選択したのは、Windowsエクスプローラーでうまく並べ替えられるためです。これを、ラベル付けしたい方法に変更できるはずです。

スクリプトの/ maxage:1の部分は、1日に変更されたものを制限するものです。私はバックアップスクリプトを毎日実行しています。

スクリプトで修正していなかった1つの問題は、ファイルが変更されていない場合でも、サイズが32kの7zファイルが作成されることです(空の7zアーカイブ)。空のディレクトリ検出を追加することを計画していました。または、何もハッシュを行わずに空の7zアーカイブハッシュと比較し、一致した場合は新しく作成された空の7zアーカイブを削除しました。

私の完全バックアップスクリプトでは、スクリプトでアーカイブをハッシュ化しているため、最後の2つの完全バックアップのハッシュを手動で比較して、それらが同じかどうかを確認できます。 (このようなスクリプトを実行しても、増分バックアップではファイルが追加されていないため、ファイルが削除されたかどうかは検出されません。)現在のハッシュと以前のハッシュが同じ場合、それ以降何も変更されていないため、最新のバックアップを削除します。 (自動化を計画していて、時間があったかどうかを確認しています。)

スクリプトのクリーンアップ(サーバー名の削除など)をしたいと思いますが、スクリプトを壊すことはありませんでした。また、スクリプトを磨く時間がなかったため、大雑把です。とにかく、私はあなたの要件を満たすスクリプトへの正しい方向に始めるのに十分であることを願っています。

スイッチの説明や、私が選択したスイッチを選択した理由が必要な場合は、遠慮なくお問い合わせください。

rem Setup Variables...
set zcmd="c:\program files\7-Zip\7z" a -t7z -r -mx=7 -ssw -mtc=on
set backupdir=C:\_backups\2burn
set tempdir=C:\_backups\temp
rem date format YYYY_MM_DD
set mydate=%date:~10,4%_%date:~4,2%_%date:~7,2%
set rc=c:\robocopy.exe

rem Make Directories...
md %backupdir%\%mydate%
if exist %tempdir% rd %tempdir% /s /q
if not exist %tempdir% md %tempdir%

rem Copy changed files...
%rc% \\server1\source\path %tempdir%\temp\path *.* /s /z /copy:dat /maxage:1 /r:5 /w:5     /log:%backupdir%\%mydate%\log.txt /np

rem Compress changed files...
if exist %tempdir%\temp\path %zcmd% %backupdir%\%mydate%\backup1.7z %tempdir%\temp\path\*.*

rem Remove temp directory...
rd %tempdir%\temp\path\ /q /s

rem copy compressed file and log to offsite server...
%rc% /copy:dat /e /z /r:5 /w:5 %backupdir%\%mydate%  "\\remote_server\share\backup_path\%mydate%"


rem email changed files log from offsite server...
rem C:\blat\blat262\full\blat -subject "BATCH: backup1 inc backup for %mydate%." -bodyf "\\remote_server\share\backup_path\%mydate%\log.txt" -server \\mailserver -f AccountToSendTo -tf c:\ListOfAdmins2Email.txt -u Username -pw Pa$$w0rd
0