720

バッチ ファイルで 7 日以上経過したすべてのファイルを削除する方法を探しています。Web を検索したところ、数百行のコードを含む例や、タスクを実行するために追加のコマンド ライン ユーティリティをインストールする必要のある例が見つかりました。

同様のことがBASHでわずか数行のコードで実行できます。Windowsのバッチファイルに対して、少なくともリモートで簡単なことを実行できるようです。追加のユーティリティを使用せずに、標準の Windows コマンド プロンプトで動作するソリューションを探しています。PowerShell や Cygwin も使用しないでください。

4

25 に答える 25

1141

楽しみ:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

詳細については、forfilesドキュメントを参照してください。

その他の機能については、Windows XP コマンド ラインの AZ インデックス を参照してください。

マシンにインストールしていない場合は、任意のWindows Server 2003から Windows XP マシンforfilesにコピーします。これは、EXE が Windows Server 2003 と Windows XP の間で完全に互換性があるため可能です。%WinDir%\system32\

それ以降のバージョンの Windows および Windows Server には、既定でインストールされています。

Windows 7 以降 (Windows 10 を含む) の場合:

構文が少し変更されました。したがって、更新されたコマンドは次のとおりです。

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"
于 2008-09-09T01:18:27.380 に答える
81

次のコマンドを実行します。

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

robocopyを介してすべてのファイルを別の場所に移動し(ファイルツリー全体を移動してから削除する/ moveとは対照的に、ファイルを移動してから削除する/ movを使用)、そのパスでdeleteコマンドを実行します。良い。

また、大量のデータを含むディレクトリがある場合は、/mirswitchを使用できます

于 2011-05-27T08:40:36.753 に答える
28

Ok は少し退屈して、これを思いつきました。これには、毎日の使用に限定された貧乏人の Linux エポック置換の私のバージョンが含まれています (時間保持なし)。

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

利用方法

set /a strip=day*7:保持する日数を7に変更します。

set dSource=C:\temp: これは、ファイルをチェックするための開始ディレクトリです。

ノート

これは非破壊的なコードで、何が起こるかを表示します。

変化 :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

次のようなものに:

if !epoch! LEQ %slice% del /f %%f

そのため、ファイルは実際に削除されます

2 月: 28 日にハードコーディングされています。バイセキスタイルの年は、本当に追加するのが地獄です。誰かが10行のコードを追加しないというアイデアを持っている場合は、投稿してコードに追加してください。

エポック:特定の日付より古いファイルを削除する必要があるため、時間を考慮しませんでした.数時間/分かかると、保持する予定の日からファイルが削除されます.

制限

エポックでは、短い日付形式が YYYY-MM-DD であることは当然のことです。他の設定または実行時評価に適合させる必要があります (sShortTime、ユーザーバインド構成を読み取り、フィルターで適切なフィールド順序を構成し、フィルターを使用して引数から正しいデータを抽出します)。

このエディターの自動フォーマットが嫌いだと言いましたか? 空白行が削除され、コピーと貼り付けは地獄です。

これが役立つことを願っています。

于 2009-08-24T14:55:55.933 に答える
23
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

/d -3(3 日前)する必要があります。これは私にとってはうまくいきます。そのため、すべての複雑なバッチがゴミ箱にある可能性があります。またforfiles、UNC パスもサポートしていないため、特定のドライブへのネットワーク接続を作成してください。

于 2011-06-08T07:46:04.857 に答える
17

同様の質問に対する私の答えを見てください:

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"

これにより、特定の日付より古いファイルが削除されます。現在の日付から 7 日間さかのぼるように変更できるはずです。

更新: HerbCSO が上記のスクリプトを改善していることに気付きました。代わりに彼のバージョンを使用することをお勧めします。

于 2009-08-24T15:11:15.987 に答える
12

私のコマンドは

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH- 私の場合は単なるパスなので、使用する必要がありました@PATH\@FILE

私もforfiles /?うまくいきませんでしたが、forfiles(「?」なしで)うまくいきました。

そして、私が持っている唯一の質問: 複数のマスク (たとえば、「. log | .bak」) を追加する方法は?

ここでダウンロードしたforfiles.exe に関するすべて(win XP の場合)

ただし、Windows サーバーを使用している場合、forfiles.exe は既にそこにあるはずであり、ftp バージョンとは異なります。そのため、コマンドを変更する必要があります。

Windows Server 2003 の場合、次のコマンドを使用しています。

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"
于 2010-12-14T06:46:25.030 に答える
11

Windows 2012 R2 の場合、次のように動作します。

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

削除されるファイルを表示するには、これを使用します

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"
于 2015-07-25T15:37:04.677 に答える
10

バッチ ファイルを使用して解決する相対日付/時刻関連の質問が非常によくあります。ただし、コマンド ライン インタープリターcmd.exeには、日付/時刻の計算機能がありません。追加のコンソール アプリケーションまたはスクリプトを使用した多くの有効なソリューションが、既にここ、Stack Overflow の他のページ、および他の Web サイトに投稿されています。

日付/時刻に基づく操作に共通するのは、日付/時刻文字列を決定された日からの秒数に変換する必要があることです。非常に一般的なのは 1970-01-01 00:00:00 UTC です。ただし、特定のタスクをサポートするために必要な日付範囲に応じて、任意の日付を使用することもできます。

Jayは、コマンド ライン インタープリターcmd.exeの高速な "日付から秒まで" ソリューションを含む7daysclean.cmdを投稿しました。ただし、うるう年は考慮されません。JRは、現在の年の閏日を考慮に入れるためのアドオンを投稿しましたが、基準年以降、つまり 1970 年以降の他の閏年は無視します。

C/C++ で記述されたアプリケーションの日付/時刻変換関数で、1970 年 1 月 1 日からのうるう日を含む日数をすばやく取得するために、小さな C 関数で一度作成された静的テーブル (配列) を 20 年間使用しています。

この非常に高速なテーブル メソッドは、FORコマンドを使用したバッチ コードでも使用できます。GetSecondsそこで、このルーチンに渡された日付/時刻文字列の 1970-01-01 00:00:00 UTC からの秒数を計算するバッチ サブルーチンをコーディングすることにしました。

注: Windows ファイル システムもうるう秒をサポートしていないため、うるう秒は考慮されません。

まず、テーブル:

  1. うるう日を含む各年の 1970-01-01 00:00:00 UTC からの日数。

    1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
    1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
    1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
    2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
    2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
    2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
    2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
    2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
    2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
    2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
    2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
    2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
    2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
    2100 - 2106: 47482 47847 48212 48577 48942 49308 49673
    

    1970-01-01 から始まるエポックで 2039 年から 2106 年の秒を計算するには、符号なし 32 ビット変数、つまり C/C++ の unsigned long (または unsigned int) を使用する必要があります。

    ただし、cmd.exeは数式に符号付き 32 ビット変数を使用します。したがって、最大値は 2147483647 (0x7FFFFFFF) で、2038-01-19 03:14:07 です。

  2. 1970 年から 2106 年までの閏年情報 (No/Yes)。

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ year 2100
    
  3. 現在の年の各月の最初の日までの日数。

                       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
    Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335
    

これらのテーブルを使用すると、日付を 1970 年 1 月 1 日からの秒数に変換するのは非常に簡単です。

ご注目ください!

日付と時刻の文字列の形式は、Windows の地域と言語の設定によって異なります。環境変数に割り当てられた区切り文字とトークンの順序DayMonthおよびYear最初のFORループではGetSeconds、必要に応じてローカルの日付/時刻形式に適合させる必要があります。

環境変数DATEの日付形式がコマンドFOR on で使用される日付形式と異なる場合は、環境変数の日付文字列を調整する必要があります%%~tF

たとえば、%DATE%expands to Sun 02/08/2015while %%~tFexpands to02/08/2015 07:38 PM以下のコードは、4 行目を次のように変更して使用できます。

call :GetSeconds "%DATE:~4% %TIME%"

これにより、サブルーチンに渡される02/08/2015のは、曜日の省略形の 3 文字と区切りのスペース文字を除いた日付文字列だけです。

または、現在の日付を正しい形式で渡すために以下を使用できます。

call :GetSeconds "%DATE:~-10% %TIME%"

現在、日付文字列の最後の 10 文字が関数に渡されるGetSecondsため、環境変数DATEの日付文字列が曜日の有無に関係なく、日と月が常に 2 桁の順序である限り、つまり形式はdd/mm/yyyy またはdd.mm.yyyyです。

C:\Tempこれは、削除するファイルとフォルダー ツリーに保持するファイルを出力するコメントを説明するバッチ コードです。最初のFORループのコードを参照してください。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Get seconds since 1970-01-01 for current date and time.
call :GetSeconds "%DATE% %TIME%"
rem Subtract seconds for 7 days from seconds value.
set /A "LastWeek=Seconds-7*86400"

rem For each file in each subdirectory of C:\Temp get last modification date
rem (without seconds -> append second 0) and determine the number of seconds
rem since 1970-01-01 for this date/time. The file can be deleted if seconds
rem value is lower than the value calculated above.

for /F "delims=" %%# in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~t#:0"
    set "FullFileName=%%#"
    setlocal EnableDelayedExpansion
    rem if !Seconds! LSS %LastWeek% del /F "!FullFileName!"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "!FullFileName!"
    ) else (
        echo Keep   "!FullFileName!"
    )
    endlocal
)
endlocal
goto :EOF


rem No validation is made for best performance. So make sure that date
rem and hour in string is in a format supported by the code below like
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time.

:GetSeconds
rem If there is " AM" or " PM" in time string because of using 12 hour
rem time format, remove those 2 strings and in case of " PM" remember
rem that 12 hours must be added to the hour depending on hour value.

set "DateTime=%~1"
set "Add12Hours=0"
if not "%DateTime: AM=%" == "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if not "%DateTime: PM=%" == "%DateTime%" (
    set "DateTime=%DateTime: PM=%"
    set "Add12Hours=1"
)

rem Get year, month, day, hour, minute and second from first parameter.

for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY
    rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second%

rem Remove leading zeros from the date/time values or calculation could be wrong.
if "%Month:~0,1%"  == "0" if not "%Month:~1%"  == "" set "Month=%Month:~1%"
if "%Day:~0,1%"    == "0" if not "%Day:~1%"    == "" set "Day=%Day:~1%"
if "%Hour:~0,1%"   == "0" if not "%Hour:~1%"   == "" set "Hour=%Hour:~1%"
if "%Minute:~0,1%" == "0" if not "%Minute:~1%" == "" set "Minute=%Minute:~1%"
if "%Second:~0,1%" == "0" if not "%Second:~1%" == "" set "Second=%Second:~1%"

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM,
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM.
if %Add12Hours% == 1 if %Hour% LSS 12 set /A Hour+=12

set "DateTime="
set "Add12Hours="

rem Must use two arrays as more than 31 tokens are not supported
rem by command line interpreter cmd.exe respectively command FOR.
set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009.
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y"
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L"
) else (
    rem Get number of days to year for the years 2010 to 2038.
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y"
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L"
)

rem Add the days to month in year.
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)

rem Add the complete days in month of year.
set /A "Days+=Day-1"

rem Calculate the seconds which is easy now.
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"

rem Exit this subroutine.
goto :EOF

最適なパフォーマンスを得るには、すべてのコメントを削除することをお勧めします。つまり、先頭のスペースが 0 ~ 4 個の後にremで始まるすべての行を削除することです。

また、配列を小さくすることもできます。つまり、上記のバッチ コードで現在サポートされている 1980-01-01 00:00:00 から 2038-01-19 03:14:07 までの時間範囲を、たとえば 2015-01 に減らすことができます。 -01 から 2019-12-31 は、以下のコードが使用するため、C:\Tempフォルダー ツリーで 7 日より古いファイルを実際に削除します。

さらに、以下のバッチ コードは 24 時間形式に最適化されています。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%# in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~t#:0"
    set "FullFileName=%%#"
    setlocal EnableDelayedExpansion
    if !Seconds! LSS %LastWeek% del /F "!FullFileName!"
    endlocal
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do (
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
if "%Month:~0,1%"  == "0" if not "%Month:~1%"  == "" set "Month=%Month:~1%"
if "%Day:~0,1%"    == "0" if not "%Day:~1%"    == "" set "Day=%Day:~1%"
if "%Hour:~0,1%"   == "0" if not "%Hour:~1%"   == "" set "Hour=%Hour:~1%"
if "%Minute:~0,1%" == "0" if not "%Minute:~1%" == "" set "Minute=%Minute:~1%"
if "%Second:~0,1%" == "0" if not "%Second:~1%" == "" set "Second=%Second:~1%"
set /A "Index=Year-2014"
for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y"
for /F "tokens=%Index% delims= " %%L in ("N Y N N N") do set "LeapYear=%%L"
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)
set /A "Days+=Day-1"
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"
goto :EOF

Windows での日付と時刻の形式とファイル時間の比較の詳細については、ファイル時間に関する多くの追加情報を含むバッチ ファイルでファイルが 4 時間以上古いかどうかを調べるに関する私の回答を参照してください。

于 2015-02-08T15:13:11.533 に答える
9

Windows Server 2008 R2 の場合:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

これにより、 90日より古いすべての.sqlファイルが削除されます。

于 2012-04-27T22:41:04.387 に答える
8

このコードをコピーして、名前を付けて保存しますDelOldFiles.vbs

CMD での使用法:cscript //nologo DelOldFiles.vbs 15

15 は、過去 15 日より古いファイルを削除することを意味します。

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here
于 2011-01-26T01:36:21.123 に答える
7

forfilesを使用します。

さまざまなバージョンがあります。初期のものはunixスタイルのパラメータを使用します。

私のバージョン(サーバー2000の場合-切り替え後にスペースがないことに注意してください)-

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"

forfilesをXPに追加するには、ftp://ftp.microsoft.com/ResKit/y2kfix/x86/からexeを取得します

そしてそれをC:\ WINDOWS\system32に追加します

于 2011-11-14T14:56:03.840 に答える
6

IMO によると、JavaScript は徐々に普遍的なスクリプト標準になりつつあります。おそらく、他のどのスクリプト言語よりも多くの製品で利用できます (Windows では、Windows Scripting Host を使用して利用できます)。多くのフォルダーにある古いファイルを一掃する必要があるため、これを行う JavaScript 関数を次に示します。

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\\temp\\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

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

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}

クリアするフォルダーごとに、clearFolder() 関数に別の呼び出しを追加するだけです。この特定のコードは、exe ファイルと dll ファイルも保持し、サブフォルダーもクリーンアップします。

于 2013-04-26T10:57:48.070 に答える
6

閏年を考慮に入れるために7daysclean.cmdでこの変更はどうですか?

10行未満のコーディングで実行できます!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

モフィによる編集:

JRによって提供された上記の条件は、構文が無効であるため、常にfalseと評価されます。

Month GEQ 2さらに 1 日分の 86400 秒の加算は、閏年では 3 月から 12 月までのみ行う必要があり、2 月については行わないため、これも間違っています。

Jayによって投稿されたバッチ ファイル7daysclean.cmdで、うるう日を考慮に入れる作業コード (今年のみ)は次のようになります。

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs
于 2010-07-01T19:38:57.160 に答える
5

このすでに貴重なスレッドにささやかな貢献を加えてもよろしいでしょうか。他のソリューションは実際のエラー テキストを取り除く可能性がありますが、アプリケーションの失敗を示す %ERRORLEVEL% を無視しています。そして、「ファイルが見つかりません」というエラーでない限り、正当に %ERRORLEVEL% が必要です。

いくつかの例:

具体的には、エラーをデバッグして排除します。

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

oneliner を使用して ERRORLEVEL の成功または失敗を返す:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

ワンライナーを使用して、他のコードの最中にあるバッチファイルのコンテキスト内で成功するために、ERRORLEVEL をゼロに維持します (ver > nul は ERRORLEVEL をリセットします)。

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

SQL Server Agent CmdExec ジョブ ステップの場合、次のようになりました。バグかどうかはわかりませんが、ステップ内の CmdExec はコードの最初の行のみを認識します。

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%
于 2015-04-02T18:58:30.410 に答える
4

XP リソース キットがある場合は、robocopy を使用してすべての古いディレクトリを 1 つのディレクトリに移動し、rmdir を使用してそのディレクトリだけを削除できます。

mkdir c:\temp\OldDirectoriesGoHere
robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
rmdir /s /q c:\temp\OldDirectoriesGoHere
于 2010-12-08T00:56:02.620 に答える
4

ROBOCOPYは私にとって非常に効果的です。もともと私のイマンを提案しました。ただし、ファイル/フォルダーを一時ディレクトリに移動してから一時フォルダーの内容を削除する代わりに、ファイルをゴミ箱に移動します!!!

これは、たとえば、私のバックアップ バッチ ファイルの数行です。

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS

「Temp」フォルダから 15 日以上経過したものはすべて消去され、AutoCAD バックアップ フォルダ内のものは 30 日以上消去されます。行がかなり長くなる可能性があり、変数を他の場所で再利用できるため、変数を使用します。ログインに関連付けられているごみ箱への dos パスを見つけるだけです。

これは私にとって仕事用のコンピューター上にあり、動作します。より制限的な権利をお持ちの方もいらっしゃると思いますが、とにかく試してみてください;) ROBOCOPY パラメータの説明については、Google で検索してください。

乾杯!

于 2016-08-15T15:29:17.110 に答える
3

あなたはこれをやってのけることができるかもしれません。より簡単な例として、この質問を見ることができます。日付を比較し始めると、複雑になります。日付が大きいかどうかは簡単にわかりますが、2 つの日付の差を実際に取得する必要がある場合は、さまざまな状況を考慮する必要があります。

言い換えれば、サードパーティのツールを本当に使用できない場合を除き、これを発明しようとしないでください。

于 2008-09-09T14:24:49.830 に答える
3

akuの回答を拡大すると、多くの人がUNCパスについて質問しています。unc パスをドライブ文字にマッピングするだけで、forfiles は満足のいくものになります。たとえば、ドライブのマッピングとマッピング解除は、プログラムによってバッチ ファイルで実行できます。

net use Z: /delete
net use Z: \\unc\path\to\my\folder
forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"

これにより、7 日より古い .gz 拡張子を持つすべてのファイルが削除されます。Z: を使用する前に他のものにマップされていないことを確認したい場合は、次のような簡単なことを行うことができます

net use Z: \\unc\path\to\my\folder
if %errorlevel% equ 0 (
    forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"
) else (
    echo "Z: is already in use, please use another drive letter!"
)
于 2014-03-14T10:05:30.180 に答える
3

これは驚くべきことではありませんが、今日このようなことをして、スケジュールされたタスクなどとして実行する必要がありました.

バッチ ファイル、以下の DelFilesOlderThanNDays.bat と、パラメータ付きのサンプル exec:

DelFilesOlderThanNDays.bat 7 C:\dir1\dir2\dir3\logs *.log

echo off
cls
Echo(
SET keepDD=%1
SET logPath=%2 :: example C:\dir1\dir2\dir3\logs
SET logFileExt=%3
SET check=0
IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log")
IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B 
IF [%1] EQU [] echo: number of days not specified? :)
echo(
echo: in path [ %logPath% ]
echo: finding all files like [ %logFileExt% ]
echo: older than [ %keepDD% ] days
echo(
::
::
:: LOG
echo:  >> c:\trimLogFiles\logBat\log.txt
echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt
echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt
echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
::
FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1
IF %ERRORLEVEL% EQU 0 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path"
)
::
::
:: LOG
IF %ERRORLEVEL% EQU 0 (
 echo:  >> c:\trimLogFiles\logBat\log.txt
 echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt
 echo:  >> c:\trimLogFiles\logBat\log.txt
 SET check=1
)
::
::
IF %check% EQU 1 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path"
)
::
:: RETURN & LOG
::
IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
于 2013-12-19T00:01:20.220 に答える