フォルダのバックアップ タスクを自動化する (圧縮、移動、命名規則に従って名前を変更する)

フォルダのバックアップ タスクを自動化する (圧縮、移動、命名規則に従って名前を変更する)

Windows 2003 R2 サーバー上のフォルダーのバックアップを自動化しようとしています (現在は手動プロセス)。

このタスクには 3 つのコンポーネントがあります。

1) サードパーティのソフトウェアを使用せずに、同じディレクトリに次のフォルダーの zip ファイルを生成します。

d:\source\folder_to_back_up

つまり、次のようになります。

d:\source\folder_to_back_up.zip

2) 新しく作成した zip ファイルを次の場所に移動します。

d:\destination

3) 次の命名規則に従って zip ファイルの名前を変更します。

Backup_YYYYMMDD.zip

たとえば、今日の日付を使用すると、名前は次のようになります。

Backup_20150516.zip

これまでのところ、ステップ 2 を自動化する方法を見つけました。

robocopy /mov d:\source d:\destination folder_to_back_up.zip

...ただし、zip ファイルの作成と名前変更の手順を自動化するには、助けが必要です。

どのようなアイデアでも大歓迎です!

答え1

他の回答のコメントで 7-zip を検討し始めたので、私が行った方法は次のとおりです。

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd

ソース変数とデスティネーション変数をインライン化すると、これは基本的にワンライナーになることに注意してください。/pushdペアpopdは、1 つのバッチで複数のバックアップを実行する場合にコンテキストが変更されないようにするためにあります。%date%は組み込みです。

適切なツールなしで特別なファイル形式 (zip) を作成しようとするのは合理的ではないと思います。これは、JDK なしで Java ソース コードを jar にコンパイルしようとするのと同じです。

依存関係

ツールを削除する問題を回避するには、上記のコードを に記述し、そのファイル名の横にbackup_stuff.batコピーして、 をに置き換えてそのファイルを正確に参照するだけです。これにより、ここに外部依存関係があるというメッセージが伝わります...7za.exebackup_stuff.bat-7za.exe7za%~dp0\backup_stuff.bat-7za

あるいは、本当に心配な場合は、7zip をバッチ ファイルに埋め込むだけです :)

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%\7za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end

:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat

echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB

rem ... lot of lines ommitted for sake of stackoverflow

echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.exe >NUL

goto exec

:end

オリジナルの 7-zip v9.20 exe ファイルでこれを実行しようとしたところ、cmd がクラッシュしました。ブロック長に制限があるようで(...)、約 370kB (b64 で約 5000 行) であることがわかりました。7-zip のオリジナルの base64 は 800kB でしたが、制限内に収まる複数のブロックに分割できるため、大した問題ではありません@(...)>>target.file。ただし、exe ファイルのサイズが 300kB 未満になるように、 through を実行することをお勧めしますupx --brute 7za.exe

出典

答え2

バッチ ファイルから zip ファイルを作成できます。これは、Microsoft Windows の Shell.Application ソフトウェア コードを使用して実行できます。また、コマンド ラインを使用して実行することもできますが、追加のコードが必要になります。例:ユーザー2868186の質問に対するAnsgar Wiechersの回答しっかりしたコード(下部付近)が含まれています。代わりに、Rob Vanderwoude の VBS のページ解決策も示します。

8 行から 12 行 (推定) の VBScript が必要になるという考えは気に入らないかもしれません。まあ、これは、MS Windows に追加されるコードの量を最小限に抑えながら自動化を行うために私が見つけた最良の方法です。MS Windows (少なくともあなたが求めているバージョン) では、より少ないコードでそれを実現する方法は提供されていないと思います。

ただし、そのコードを定期的に追加する場合は、複数回入力するよりもダウンロードしたほうがよいでしょう。ダウンロードする場合は、7-Zip や Info-Zip などの他のコードをダウンロードしたほうがよいかもしれません。7-Zip は、コマンド ラインからの使用方法を習得するのにもう少し時間がかかるかもしれませんが、私はうまくいきました。また、これを複数回行う予定がない場合は、ソフトウェアを一度追加することが長期的にはおそらく良い解決策である (最小限の時間投資で、長期的な見返りが得られる) という別の理由があるでしょう。そのようなソフトウェアを使用することがまさにあなたの質問ではないことは理解していますが、それが最終的に最善の解決策であるかどうかを真剣に検討することをお勧めするため、とにかくそのことを取り上げています。

3 番目の手順については、バッチ ファイルに次のコードを配置します。
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate% 表示されている FOR コマンドは、バッチ ファイルから実行することを意図していることに注意してください。バッチ ファイルの外部でまったく同じコマンドを実行しようとしても、うまくいきません。Win7 SP1 でテストしました。テスト用の 2003 R2 サーバーが手元にありませんが、このアプローチはうまくいくと思います。

私はここにロリーの時間についての質問に対するジェイの答えこのアプローチの基礎として。

関連情報