Пакетный скрипт для удаления старых файлов в определенной папке - PullRequest
0 голосов
/ 24 июня 2019

Я ищу для создания командного файла для требования ниже:

Корневая папка - D: \ Olderfiles \ SourceDocuments

Внутри этой корневой папки у нас есть много папок и подпапок.В каждой из этих папок у нас может быть или не быть папка с именем Archive.Нам нужно удалить файлы * .xlsx, которые не обновлялись за последние 120 дней, из этих папок, названных «Архив».

Я пробовал скрипт ниже, но он не работает должным образом.

forfiles /p "D: \ Olderfiles \ SourceDocuments" / s / m * \ Archive \ *. xlsx / D -120 / C "cmd / c del @path"

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Известны ошибки в проверке даты ForFiles в определенных версиях Windows.

Чтобы обойти это, вы можете использовать Robocopy, чтобы сгенерировать список подходящих файлов, а затем удалить их с помощью цикла For:

MD "%temp%\Empty"
FOR /F "Tokens=*" %%A IN ('
 ROBOCOPY "D:\Olderfiles\SourceDocuments" "%temp%\Empty" *
   /MinAGE:120
   /L /NP /NC /NS /FP /NDL /NJH /NJS
 ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
') DO @(
    DEL /F/Q "%%~A"
)

В зависимости от количества файлов и подкаталогов это или ForFiles может занять некоторое время, так как вам нужны только папки «Архив».

Итак, чтобы ускорить это, давайте проверим только каталоги с именем «ARCHIVE», используя DIR, чтобы соответствовать только этим, и затем мы зациклим этот список для запуска robocopy:

Это будет намного быстрее, чем Forfiles или вышеуказанный цикл:

MD "%temp%\Empty"
FOR /F "Tokens=*" %%a IN ('
    DIR /AD/S/B "D:\Olderfiles\SourceDocuments\*Archive" 
') DO (
    FOR /F "Tokens=*" %%A IN ('
        ROBOCOPY "%%~A" "%temp%\Empty" *
            /MinAGE:120
            /L /NP /NC /NS /FP /NDL /NJH /NJS
        ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
    ') DO (
        DEL /F/Q "%%~A"
    )
)

Если вы просто вставляете это в строку CMD, вам нужно использовать это, чтобы просто удалить знак% из каждой переменной цикла:

MD "%temp%\Empty"
FOR /F "Tokens=*" %a IN ('
    DIR /AD/S/B "D:\Olderfiles\SourceDocuments\*Archive" 
') DO (
    FOR /F "Tokens=*" %A IN ('
        ROBOCOPY "%~A" "%temp%\Empty" *
            /MinAGE:120
            /L /NP /NC /NS /FP /NDL /NJH /NJS
        ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
    ') DO (
        DEL /F/Q "%~A"
    )
)
1 голос
/ 24 июня 2019

В вашем пакетном скрипте вы можете использовать скрипт PowerShell.При этом используются некоторые функции текущей PowerShell 5. Это может быть сделано с более старыми версиями с некоторыми изменениями.Если вы уверены, что правильные файлы будут удалены, удалите -WhatIf из командлета `Remove-Item.

=== delold.ps1

Get-ChildItem -Recurse -Directory -Path 'D:\Olderfiles\SourceDocuments' -Filter 'Archive' |
    ForEach-Object {
        Get-ChildItem -File -Path $_.FullName -Filter '*.xlsx' |
            ForEach-Object {
                if ($_.LastWriteTime -lt (Get-Date).AddDays(-120)) {
                    Remove-Item -Path $_.FullName -WhatIf
                }
            }
    }

=== delold.bat

powershell -NoLogo -NoProfile -File "delold.ps1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...