2

何日も前のファイルを削除するコマンドを知っています。forfiles コマンドを使用して 12 時間前のファイルを削除する方法

.bat ファイルで forfile コマンドを使用しています

4

2 に答える 2

2

Windows バッチで日付と時刻を操作するのがいかに難しいかはばかげています。PowerShellの方が優れているのではないかと思いますが、よくわかりません。

日付と時刻の演算と書式設定を行う便利なハイブリッド JScript/バッチ ユーティリティを作成しました。これを使用して、12 時間前の日付と時刻を確立し、必要なほぼすべての形式にフォーマットできます。このユーティリティは、XP 以降のすべての Windows プラットフォームで動作します。これは純粋なスクリプトであるため、exe ファイルのダウンロードやインストールは必要ありません。getTimestamp.bat はこちらから入手できます。実際のユーティリティは記事の最後にあり、スクリプト内に詳細なドキュメントが含まれています。

このFORコマンドは最終変更日時を表示できますが、ローカライズされた書式を使用しているため、一般的なコードでの解析が困難です。さらに悪いことに、夏時間が有効かどうかも無視されます。そのため、標準時と夏時間の間でどちらかの方向に移行する日の経過時間を正確に判断することができなくなります。

WMIC は、ロケール間で変わらないユニバーサル形式で、夏時間を考慮したタイム ゾーン情報を備えたタイムスタンプを提供します。タイムスタンプは、文字列比較を行うときに時系列でソートされる形式になっています。これは非常に重要で便利なポイントです。

このgetTimestamp.batユーティリティを使用して、現在のタイムスタンプと削除のカットオフ タイムスタンプを取得できます。ファイルのタイムスタンプと現在のタイムスタンプが夏時間に関して一致しない場合は、カットオフを + または - 1 時間調整する必要があります。比較を簡単にするために、カットオフは WMIC タイムスタンプと一致するようにフォーマットされます。

getTimestamp.batが現在のフォルダーにあるか、さらには のどこかにあると仮定するとPATH、次のように動作するはずです。ローカルの夏時間調整が 1 時間である限り、世界中のどこでも機能するはずです。サマータイムが 1 時間以外の地域があるかどうかはわかりません。

私は一般的にコードをテストしましたが、夏時間への移行日はテストしていません。論理が逆になってしまったのかもしれません。

@echo off
setlocal disableDelayedExpansion

:: Define the folder to delete from.
:: The value must be a path without a file name or file wild cards.
set "folderPath=d:\test"

:: Define the hour offset for the deletion cutoff
set /a hourOffset=-12

for /f "delims=" %%F in ("%folderPath%\") do (
  set "driveFilter=%%~dF"
  set "pathFilter=%%~pF"
)
for /f "tokens=1-3" %%A in ('getTimestamp -f "{ums} {zzzz} {z}"') do (
  set "now=%%A"
  set "tz=%%B"
  set "z=%%C"
)
call getTimestamp -d %now% -oh %hourOffset% -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff
call getTimestamp -d %now% -oh %hourOffset%-1 -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff-1
call getTimestamp -d %now% -oh %hourOffset%+1 -f {yyyy}{mm}{dd}{hh}{nn}{ss} -r cutoff+1
for /f "tokens=1* delims=." %%A in (
  'wmic datafile where "Drive='%driveFilter%' and Path='%pathFilter:\=\\%'" get LastModified^,Name'
) do for /f "tokens=2* delims=+- " %%C in ("%%B") do (
  if "%%C" neq "%tz:~1%" (
    set "fz=%%B"
    set "file=%%~fD"
    setlocal enableDelayedExpansion
    set /a "fz=!fz:~6,1!1!fz:~7,3!%%1000"
    if !fz! lss !z! if "%%A" leq "%cutoff-1%" del "!file!"
    if !fz! gtr !z! if "%%A" leq "%cutoff+1%" del "!file!"
    endlocal
  ) else (
    if "%%A" leq "%cutoff%" del "%%~fD"
  )
)
exit /b
于 2013-08-03T00:00:57.430 に答える