2017-02-02 21 views
0

Win7でバッチバックアップスクリプトを設定しようとしています。ほとんどの場合動作しますが、私はコードを複数回実行しています。私はいくつかの検索を行いましたが、バッチファイルが "()"のコードをどのように処理するかとは関係がありますが、それを修正する最良の方法は不明です。Windowsバッチスクリプト - for/D delims複数回実行

何か助けが素晴らしいだろう!

スクリプト: "%% I" == "%%〜Ndは" trueの場合

for /D %%d in (C:\toBackupDir\*.*) do (
for %%f in (C:\zipDir\*) do (
    for /f "tokens=1 delims=_" %%i in ("%%~nf") do (
    if "%%i"=="%%~nd" (
    if "%%~tf"=="%%~td" (
     echo "%%~nf" is "%%~nd" No Backup necessary. 
    ) else (
     7z.exe a -tzip -stl -mx=1  "C:\zipDir\%%~nd_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.zip" "%%d" 
    ) 
    ) 
) 
) 
) 

ライン "7z.exeは" 何度も実行されます。私の考えでは、ファイル名を分割する最後のforループが何度も実行されていますが、%iを取得して比較を行うと、私はそれを行います。 "7z.exe"行が実行されたらループから抜け出すことはできますか?私は、バッチファイルで壊れることはやりにくいと読んだことがあります。

コードの内訳が必要な場合はお知らせください。

ありがとうございます!

+0

あなたは 'もし "%%〜TF" == "%%〜TD"('のか? 'c:\ zipdir'にファイルを作成しているので、' 7z'インスタンスが呼び出されるたびにその時刻が変更されます。おそらくそれは遅すぎるかもしれませんが、あなたがやろうとしていることをかなり忘れてしまいます。コメント( 'REM'コメントは' :: 'コメントではなくコードブロック内にあることを覚えておいてください)多くのことを説明してくれるかもしれません。 – Magoo

+0

私たちは本当にコードの内訳を必要としません。あなたが実行しようとしているタスクと、その期待に関連して何が起こっているのかを確認してください。 – Compo

+0

あなたの返事ありがとうございました。私は通常それを比較することはできません知っている。私は問題を抱えていたスクリプトの部分だけを掲載しました。私は一時ファイル上のスクリプトのこの部分を実行するFolderTimeUpdate b4を実行しています。 FolderTimeUpdateは各ディレクトリ内のすべてのファイルをスキャンし、親フォルダのタイムスタンプを子ディレクトリ内の最も古いファイルのタイムスタンプに更新します。7-Zipは-stlスイッチを使って最も古いフォルダにタイムスタンプを設定しています。空のフォルダがなく、Zipを手作業で整理している限り、これは機能します。スクリプトはまだ動作する必要があります...しかし、これは私が現在立ち往生している場所です。 –

答えて

0

すべてのディレクトリをすべてのzipファイルに対してもテストします。 これは250ディレクトリと一致するzipとの比較60000以上です。しかし、これはまったく必要ではありません。それで、あなたはフォルダ比較の時間に対して反対することはできません - それはそれ自身を更新しません。したがって、DIRからの出力はまったく適切ではない。 さらに、既存のジップヒューズとは何か、これらも毎回比較されます。フォルダの2回のバックアップでは、バッチは常に新しいバックアップを作成します。 Zipファイルを検索するシンプルなループは、実際には終了していません。なぜなら、常に新しいファイルがMFTに入力され、ループは作成後にループするからです。

このタイムスタンプは比較に非常に適しているので、私はファイルをリスト表示するためにrobocopyを使用しました。 まず、フォルダのみがチェックされ、適切なzipファイルがチェックされます。フォルダは、ファイルと適切なzipファイルに対して再帰的にチェックされます。タイムスタンプはリストに配置され、ソートされます。最後の(つまり最新の)ファイルがzipのフォルダから来た場合、ループは最後の値を設定します。バックアップは必要ありません。 ファイル名に適したタイムスタンプも生成されます。

パスを調整する必要がある場合があります。

@echo off 
setlocal 
set "Folder=d:\toBackup" 
set "Backup=d:\zipdir" 
call :TAB 
set "TS=." 
for /d %%F in ("D:\files\*")do (
    set "TsFn=" 
    set "tozip=" 
    for /f "tokens=2,3delims=%TAB%" %%A in (' 
    (robocopy /L "%backup%" ".. only listing ..\\" "%%~nF_*.zip" /njh /fp /ts /ns /nc /ndl /njs^
    ^& robocopy /L /e "%%F" ".. List only ..\\" /njh /fp /ts /ns /nc /ndl /njs ^)^|sort 
    ')do ( 
    set "TsFn=%%A*%%~dpB" 
    if /i "%%~dpB"=="%Backup%\" (set "tozip=" 
    )else set "tozip=1" 
) 
    if defined tozip call :timestamp 
    if defined TsFn (
    setlocal enabledelayedexpansion 
    for /f "tokens=1-3delims=*" %%S in ("!TS!*!TsFn!")do (
     endlocal 
     if NOT defined tozip (echo %%T %%~nxF - No Backup necessary. 
    )else echo 7z.exe a -tzip -stl -mx=1 "%Backup%\%%~nF_%%S.zip" "%%F" 
    ) 
) 
) 
pause 
exit /b 

:TAB 
for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T" 
rem END TAB 
exit /b 

:Timestamp 
rem robocopy /L "\.. Timestamp ..\\" . 
for /f "eol=D tokens=1-6 delims=/: " %%T in (' robocopy /L /njh "\|" .^|find "123" ') do (
    set "TS=%%T%%U%%V-%%W%%X%%Y" 
    set "TSDATE=%%T%%U%%V" 
    set /a YY=%%T , MM=100%%U %%100 , TT=100%%V %%100 
) 
rem END Timestamp 
exit /b 

まだ対応するフォルダからのzipファイルがない場合は、もちろんジップが作成されます。つまり、バックアップディレクトリ時間にFILETIMEを比較 -

完全なバックアッププログラム

+0

よろしくお願いします。ありがとうございます!また、私のスクリプトの穴に注意を払うためにタイ。私は実際に認識していた。私は別のプログラムでフォルダのタイムスタンプを強制していましたが、2つのzipがあった場合にあなたが話していた問題を防ぐために、必要に応じてZipsを手動で削除していました。私はこの問題を解決した後、攻撃を計画していました。それはyoureのように "enabledelayedexpansion"でこれを解決するように見えます。私はその道を歩み始めましたが、if文の中でそれを設定してしまえば失われてしまったことに気づかなかったのです。私はスクリプトを書くのが初めてです。私はおそらくちょうどあなたのコードを使用して終了します...しかし、私はそれを最初に櫛をかけるでしょう。 –

関連する問題