2

Я пытаюсь выяснить код для пакетного файла (Windows), который в указанной папке рекурсивно удаляет все, кроме файлов с определенным расширением (т.е. .mkv и .nfo)?

Как то так, но для вышесказанного.

def deleteRootFolder = tryQuietly{ root.toBoolean() }

/*
 * Delete orphaned "clutter" files like nfo, jpg, etc and sample files
 */
def isClutter(f) {
    def exts    = tryQuietly{ exts }            ?: /jpg|jpeg|png|gif|nfo|xml|htm|html|log|srt|sub|idx|md5|sfv|txt|rtf|url|db|dna|log/
    def terms   = tryQuietly{ terms }           ?: /sample|trailer|extras|deleted.scenes|music.video|scrapbook/
    def maxsize = tryQuietly{ maxsize as Long } ?: 100 * 1024 * 1024

    // path contains blacklisted terms or extension is blacklisted
    return (f.extension ==~ "(?i)($exts)" || f.path =~ "(?i)\\b($terms)\\b") && f.length() < maxsize
}


def clean(f) {
    println "Delete $f"

    // do a dry run via --action test
    if (_args.action == 'test') {
        return false
    }

    return f.isDirectory() ? f.deleteDir() : f.delete()
}


// delete clutter files in orphaned media folders
args.getFiles{ isClutter(it) && !it.dir.hasFile{ (it.isVideo() || it.isAudio()) && !isClutter(it) }}.each { clean(it) }

// delete empty folders but exclude given args
args.getFolders().sort().reverse().each { if (it.listFiles().length == 0) { if (deleteRootFolder || !args.contains(it)) clean(it) } }

2 ответа2

3

Вот один быстрый способ сделать это среди многих:

@echo off
set extlist=mkv nfo
set rootfolder="C:\Video Folder"
pushd %rootfolder%
if not ["%cd%"]==[%rootfolder%] echo Aborting as unable to change to %rootfolder% && goto End
attrib /s /d -r
for %%a in (%extlist%) do attrib /s *.%%a +r
del. /s /q
:End
popd

Сначала запустите тестовый каталог с несколькими файлами, которые вы хотите сохранить, и другими файлами, которые вы хотите удалить, прежде чем открывать их в своем основном каталоге. Если вы хотите, чтобы пакетный файл запрашивал подтверждение удаления для каждого файла, измените del. /s /q в del. /s /p .

1

это другой способ без необходимости изменять атрибуты, посмотрите на вывод и удалите echo , если все в порядке:

@echo off &setlocal
set "extlist=.mkv|.nfo|"
for /r "c:\video" %%i in (*) do (
    set "fname=%%~i"
    setlocal enabledelayedexpansion
    if "!extlist:%%~xi|=!"=="%extlist%" echo del "!fname!"
    endlocal
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .