web-dev-qa-db-ja.com

指定した日付より古いファイルを削除するバッチファイル

指定した日付より古いファイルを削除するバッチファイルを作成するにはどうすればよいですか?

これは機能していないようです。

:: --------DELOLD.BAT----------
@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX

for /f "tokens=2" %%i in ('date /t') do set thedate=%%i
type %1
pause
set mm=%thedate:~0,2%
set dd=%thedate:~3,2%
set yyyy=%thedate:~6,4%

set /A dd=%dd% - %OLDERTHAN%
set /A mm=%mm% + 0

if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1

:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31

goto ERROR

:SET31
set /A dd=31 + %dd%
goto DONE

:SET30
set /A dd=30 + %dd%
goto DONE

:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29

:SET28
set /A dd=28 + %dd%
goto DONE

:SET29
set /A dd=29 + %dd%

:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
for %%i in (*.*) do (
set FileName=%%i
call :PROCESSFILE %%~ti
)

set mm=
set yyyy=
set dd=
set thedate=
goto EXIT

:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD X
ECHO   Where X is the number of days previous to Today.
ECHO.
ECHO EX: "DELOLD 5" Deletes files older than 5 days.
GOTO EXIT

:PROCESSFILE
set temp=%1
set fyyyy=20%temp:~6%
set fmm=%temp:~0,2%
set fdd=%temp:~3,2%
if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6%


:: ***************************************
:: * This is where the files are deleted *
:: * Change the ECHO command to DEL to   *
:: * delete. ECHO is used for test.      *
:: ***************************************
if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
ECHO %FileName%
)

set temp=
set fyyyy=
set fmm=
set fdd=

:EXIT

:: ----------END-DELOLD.BAT-------------
15
ccc

私はこのスクリプトを使用します:

////////////////////////////////////////////////////////
// Deletes file older than a number of days 
// in the current directory
////////////////////////////////////////////////////////
// Usage: wscript DeleteOlderThan.js [#Days]
// By default, remove files older than 30 days
////////////////////////////////////////////////////////

function removeDays(date, nDays)
{
    var dateRet = date
    return dateRet.setDate(date.getDate() - nDays);
}

function addSlash(strPath)
{
    var c = strPath.substr(-1, 1);
    if( c !== '\\' && c !== '/' )
    {
        strPath += '\\';
    }
    return strPath;
}

// Read arguments
var nDays = WScript.Arguments(0) || 30;

// Create system objects
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var Shell = WScript.CreateObject("WScript.Shell");

// Retrieve current directory
var strDirectoryPath = addSlash(Shell.CurrentDirectory);

// Compute date
var dateNow = new Date();
var dateTest = removeDays(dateNow, nDays);

// Iterate on files
var folder = fs.GetFolder(strDirectoryPath);
var files = folder.Files;

for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
{
    var file = it.item();

    if( file.DateLastModified < dateTest)
    {
        file.Delete(true);
    }
}

私は毎日それを呼び出します:

wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30
10
Vincent Robert

Windowsサーバーを使用しているか、サーバーリソースキットがインストールされている場合は、 forfiles がまさに探しているものである可能性があります。

例:180日以上経過したすべてのファイル名を印刷する

forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt

すべてのPDFファイル、365日より古いファイルを削除する

forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path"
10
ℳ  .

eJames:あなたのxcopyソリューションは非常にうまく機能することがわかりました。 XCOPYパラメータの形式は日付設定に依存しないように見えるので、私が最も気に入っているのは、英語以外のWindows言語バージョンでも機能することです。素晴らしい! ;]

1つの改善点は、FILES_TO_KEEP.TXTファイルを事前に作成することです。これにより、保持基準に一致するファイルがない場合でも、2番目のXCOPYステートメントは続行して削除を実行できます(FILES_TO_KEEP.TXTファイルが見つからない場合は失敗します)。これが私のスクリプトです(この例では、*。pdfファイルのみを削除するように変更しました。また、一時ファイルの名前を変更して、潜在的な競合がないことを確認し、後で一時ファイルをクリーンアップしています)。

@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX

echo >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa"
del ~~~FILES_TO_KEEP.TXT~

GOTO END

:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD mm-dd-yyyy
ECHO   Where mm-dd-yyyy is the date prior to which you want to delete files.
ECHO.
ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008.
ECHO.
ECHO This should work on any language version of Windows, but has only been 
ECHO tested in English-US versions.
GOTO END

:END
6
HerbCSO

編集: 私はそれを考え出した。

特定の日付より古いすべてのファイルを削除するには:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

特定の日付より新しいすべてのファイルを削除するには:

REM del_new.bat
REM usage: del_new MM-DD-YYYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa"
6
e.James

私の解決策はあなたがうまくいくなら

  • あなたのシステムにtouchユーティリティがあるか(私はそうします)
  • または、dateコマンドを使用してシステム日付を一時的に変更する余裕があります(これはおそらく当てはまりませんが、誰が知っているでしょうか)。

ここにアイデアがあります:

  1. ターゲットディレクトリで、信号ファイル(一意の名前)を作成し、タイムスタンプを削除しきい値時間と同じにします。これは、touch(パラメーターとして目的のタイムスタンプを受け入れる)を使用して、または_date /T_で現在の日付を記憶し、_date <param>_でシステム日付を目的の日付に変更して、元の日付を復元することで実行できます。

  2. for /f %%I in ('dir /od')を使用して、日付順に並べられたすべてのファイルを反復処理し、1つずつ削除します。シグナルファイルを見つけて削除した後、削除を停止します。

1
atzz

たぶんあなたはこれを望みます: http://blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/

それは1年以上前のファイルを移動するスクリプトであり、さまざまな日付形式とサブフォルダもサポートしています。いくつかの変更を加えて、移動する代わりに削除することもできます。コメントと説明付きの非常に完全なスクリプトです。

1
NiklasJ

なぜole DOSシェルを使用する必要があるのか​​... Python または Windows Powershell は2008年の正しい選択です:)

0