3

サーバーとの双方向同期を実行するために、Windows バッチ ファイルに取り組んでいます。バッチ ファイルは、複数のコンピュータを 1 つのネットワーク ロケーションと同期するために、複数の人によって使用されます。私が踏み込めない制限のため、バッチファイルでなければなりません。VBScript も JavaScript もありません。Windows バッチのみです。バッチ ファイル内から実行できる限り、Powershell コマンドは問題ないかもしれません。

ファイルの削除を許可するために、robocopy を数回実行します。まず、/MAXLAD スイッチを使用して前回スクリプトを実行したときよりも新しいファイルをコピーします。これは両方向で行われます。次に、/l スイッチを使用してミラーリングを行い、終了コードをチェックして余分なファイルを検出します。いずれかの側に余分なファイルがある場合、適切な方向でミラーを実際に実行します。

スクリプトはそのままで問題なく動作しますが...

問題は、/MAXLAD が YYYYMMDD の形式で日付を受け入れるため、ローカルでファイルを作成し、同期スクリプトを実行し、すぐにファイルを削除して再度同期すると、墓から戻ってくることです。ファイルを正常に削除するには、最後にスクリプトを実行してから少なくとも 1 日前までファイルが変更されていない必要があります。この制限を取り除く方法が欲しいので、ユーザーが好きなだけ実行して、期待どおりに動作できるようにします。

私の質問はこれです:最終アクセス時間をより正確にする方法はありますか? 時間まで絞れれば、改善です。新しいファイルをコピーするには、robocopy 以外のことをする必要がありますか?

4

1 に答える 1

1

AFAIKを使用ROBOCOPYすると、精度を 1 日以上細かくすることはできません。
ただし、他の 2 つの方法を使用して、より詳細にすることは可能です

DIR /o:d /a:-d

現在のディレクトリのファイルを新しいものから古いものの順に並べ替え、ディレクトリをリストから除外します。
古いものから新しいものへとリストを逆にするには、 に変更/o:d/o:-dます。


また、FORステートメントは同じ種類のことを行うことができます。

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set count=0
:: If some other process left %tmp%\temp.txt, delete it.
if exist %tmp%\temp.txt del %tmp%\temp.txt

for %%x in (*.*) do (
    set /a count=!count!+1
    :: Capture Size
    set size=000000%%~zx
    :: Capture Date and Time
    set td=%%~tx
    :: Turn Date into YYYY/MM/DD format
    set dd=!td:~6,4!/!td:~0,5!
    :: Set tt=hour of day
    set tt=!td:~11,2!
    :: Turn AM/PM time into 24 hour day time
    if !td:~-2!==PM set /a tt=!tt!+12
    :: Add :Minutes to time
    set tt=!tt!:!td:~-5,2!
    :: Append Size Date Time FileName to temp.txt
    call echo !size:~-5! !dd! !tt! %%x>>%tmp%\temp.txt
rem    :: Create variable size[n] and set it to: Size Date Time FileName
rem    call set size[!count!]=!size:~-5! !dd! !tt! %%x
)

echo.
echo Size  Date       Time  FileName
echo ===== ========== ===== ===============

::
:: Alternate 1: Replacing the Append line to `temp.
:: :: Print Array into %tmp%\temp.txt
:: for /l %%x in (1 1 %count%) do (
::  :: Pipe variable into a file
::  echo !size[%%x]!>>%tmp%\temp.txt
:: )

::
:: Alternate 2: Another way to iterate through the array size[n]
:: :loop
::   set /a ctr=%ctr%+1
::   echo !size[%ctr%]!
:: if %ctr% lss %count% goto loop

::
:: Sort temp.txt, starting at the 6th character (the date).
type %tmp%\temp.txt | sort.exe /+6
del %tmp%\temp.txt
echo.

上記のコードは、見かけほど長くも複雑でもありません。その多くは単なる注釈であり、半分近くがコードを占めています。残りの多くは冗長なコードであり、表示するためだけに示されています

于 2012-10-21T09:03:50.760 に答える