0

最終変更日の期間に基づいてフォルダを圧縮し、後で削除する方法を探しています

構造は次のとおりです

Folder_1 01.01.2012 12:00
- sub1
- sub2
  - file1
  - file2
Folder_2 01.01.2012 12:02
...
Folder_20202 05.05.2012 03:00

今欲しいです:

  1. 今月より3か月古いすべてのフォルダを選択します(たとえば、現在が5月の場合、lastmodifiedは2月です)。重要な点は、-90日ではなく、月の最初から最後までを使用したいということです。
  2. 次に、選択したフォルダーをすべてのサブフォルダーとファイルとともに1つのfebruary2012.zipに圧縮します。
  3. (現在の)zipファイルのオリジナルを削除する

これまでの私の最善のアイデアは、forfiles.exe(1つの日付のみを取る)を使用し、生成された日付(3か月前の1日目で、より古い修飾子を使用)を使用してresultextfileを作成することです。次に、結果ファイルを7zip.exeのインポートとして使用し、ファイルをループして、後でフォルダーを削除します(パート2および3の場合、まだ機能するコードはありません)

- アップデート -

現在、私は次のことを実験しています。

FORFILES /P H:\Temp\2zip /M O* /D -31.4.2012 /C "cmd /c C:\Program Files (x86)\7-Zip\7z.exe a -t7z H:\temp\x2.zip @path

これは機能しているようですが、非常に遅いです(理由はマップされたドライブ-> 150MBの場合は3時間です)

4

1 に答える 1

0

フォルダの最終変更日を操作するときは注意してください。FATファイルシステムでは、フォルダの内容が変更されてもタイムスタンプは変更されません。

NTFSファイルシステムでは、ファイルまたはフォルダがフォルダ内で作成または削除されるたびに、最終更新日が更新されます。ただし、ファイルが変更された場合、またはファイル/フォルダーがサブフォルダーで作成または削除された場合は更新されません。

それでも計画を進めたい場合は、基本的な戦略はかなりしっかりしています。Windowsバッチは、日付の処理に対するサポートが非常に弱いため、改善の余地はあまりありません。

ロケールに関係なく、現在の日付(および必要に応じて時刻)を解析する最良の方法は、WMICを使用することです。

for /f "skip=1" %%A in ('wmic os get localdatetime') do (
  set currentDateTime=%%A
  goto :exitLoop
)
:exitLoop
set year=%currentDateTime:~0,4%
set month=%currentDateTime:~4,2%

後でフォルダを削除する必要がないように、7zipの移動オプションを使用できるはずです。

FOR / Fを使用してFORFILESの結果を処理することにより、一時ファイルの必要性を排除できるはずです。さらに良いことに、FORFILES/Cオプションを使用して適切な7zipコマンドを指定できる場合があります。

于 2012-05-15T12:34:23.820 に答える