Пакетное удаление всех файлов, кроме частичных

У меня есть командный файл, который постоянно проверяет, есть ли какие-либо файлы в каталоге:

    @echo off
    cls
    mode 15,5 
    cd C:\Users\Toni\Downloads\
    goto mark
:mark
    set var=2
    dir /b /a "Downloads\*" | >nul findstr "^" && (goto exin) || (goto mark1)
    goto mark
:mark1
    cls
    @ping -n 10 localhost> nul
    goto mark
:exin
    start /B C:\Users\Toni\Downloads\Test\download.bat
    exit

если в этой папке есть какие-либо файлы, они перемещаются.

    @echo off
cls
cd C:\Users\Toni\Downloads\Downloads        
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.rar C:\Users\Toni\Downloads\Archive
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.zip C:\Users\Toni\Downloads\Archive
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.exe C:\Users\Toni\Downloads\Setups_usw
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.msi C:\Users\Toni\Downloads\Setups_usw
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.mp3 E:\-_MUSIC_-\Musik
        xcopy /Y C:\Users\Toni\Downloads\Downloads\*.wav E:\-_MUSIC_-\Musik
        xcopy /S /E /Y /EXCLUDE:C:\Users\Toni\Downloads\Test\excludedfileslist.txt C:\Users\Toni\Downloads\Downloads\*.* C:\Users\Toni\Downloads\Sonstiges
    goto err        
    :err
    if errorlevel 1 ( dir /arashd >> "C:\Users\Toni\Downloads\Test\somefile.txt" 2>&1  ) else ( del /[!*.part] * )
    goto end
    :end
    start /B C:\Users\Toni\Downloads\Test\run.cmd
    exit

Однако я не хочу перемещать файлы, которые находятся в процессе загрузки (т. Е. Я не хочу перемещать частичные файлы с .part расширение).

Я пытался использовать аргумент del команда вроде так:

del /[!*.part] *

но это не похоже на работу.

Как я могу избежать перемещения частичных файлов с .part расширение?

2 ответа

Решение

Я бы, наверное, посмотрел на расширение файла (используя "подстановку переменных FOR").

SET "TARGET_DIR=C:\Users\Toni\Downloads\Downloads"
FOR /F "delims=" %%f IN ('dir /b "%TARGET_DIR%"') DO (
    REM  Ensure it doesn't have '.part' as an extension.
    IF NOT "%%~xf"==".part" (
        REM  Ensure there's not a corresponding ".part" file.
        IF NOT EXIST "%TARGET_DIR%\%%~f.part" (
            DEL "%TARGET_DIR%\%%~f"
        )
    )
)

Это удалит любой файл в TARGET_DIR который не имеет ".part" в качестве расширения имени файла или соответствующего файла ".part". (По моему опыту загрузчики, которые выполняют функцию ".part", также резервируют имя "готового" файла, который вы, вероятно, не хотите удалять.)

Другое возможное решение (короче, чем у @mojo):

@echo off
cd /d C:\Users\Toni\Downloads\Downloads
attrib +h *.part
for /f "delims=" %%A IN ('dir /b /A:-H') do del %%A
attrib -h *.part

Это, скроет все .part файлы, удалите все остальные файлы и снова удалите скрытый атрибут.

Другие вопросы по тегам