Пакетный файл CMD для удаления файла, если он не найден в списке из текстового файла txt

Мне нужна летучая мышь, чтобы удалить все файлы с ОТНОСИТЕЛЬНЫМ именем, которые НЕ содержатся в текстовом файле

В текстовом файле list.txt у меня есть это:

C:\S-ATLANTICO-1\MEDIA\Innplay-Logo.mp4
C:\S-ATLANTICO-1\MEDIA\logo-FB_sep.png
C:\S-ATLANTICO-1\MEDIA\logo-news_sa.png

и в той же папке есть эти файлы:

Innplay-Logo.mp4
logo-FB_sep.png
logo-news_sa.png
Carlos.jpg
Sapo.png
list.txt

Поэтому мне нужно удалить следующие файлы, потому что они не существуют в list.txt

Carlos.jpg
Sapo.png

но я также ДОЛЖЕН СОХРАНИТЬ СПИСОК.TXT

я пробовал это, но без успеха

@echo off
setlocal
set "folder=C:\S-ATLANTICO-1\MEDIA"
set "excludeFile=C:\S-ATLANTICO-1\MEDIA\list.txt"
for /f "eol=: delims = " %%F in ('dir /b /a-d "%folder%" ^| findstr  /vig:"%excludeFile%" ^| findstr /v /i "\list.txt"') do del "%folder%\%%F"

любой может помочь мне с этим.

Спасибо

Почему именно файл .bat?

melpomene 29.05.2019 17:24

Проблема: вы сравниваете вывод dir /b (file.txt) с содержимым файла исключения C:\path\file.txt, поэтому вы не получите правильных совпадений. Самый простой способ обойти это: for /f "eol=: delims = " %%F in ('dir /s /b /a-d "%folder%" ^| findstr /vlig:"%excludeFile%" ^| findstr /vli "%excludefile%"') do @echo del "%%F", но имейте в виду, что dirswitch /s` дает полный путь/имена файлов, но также и файлы из подпапок. (может быть или не быть проблемой в вашем случае)

Stephan 29.05.2019 18:10

Спасибо @Stephan, это работает нормально, но у меня будут проблемы с подпапками... спасибо

Carlos Costa 29.05.2019 19:03

У вас, вероятно, не будет проблем, но это значительно замедляет работу.

Stephan 29.05.2019 19:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
450
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте. Это работает для моего тестирования.

Я поместил операторы эхо вместо чего-либо удаление.

@echo off
setlocal
set "folder=C:\S-ATLANTICO-1\MEDIA"
set "excludeFile=%folder%\list.txt"

:: Check that both the target folder and filter file exist before starting up.
if not exist "%folder%" echo %~nx0: The target folder doesn't exist.  Nothing to do.&& goto :EOF
if not exist "%excludeFile%" echo %~nx0: The list file doesn't exist at the location specified!&& goto :EOF

for /f "delims = " %%F in ('dir /b /a-d "%folder%"') do call :process_file "%%F" "%~0" "%excludeFile%"
goto :EOF

:: --------------------------------------------
:process_file
:: --------------------------------------------
set input_file=%~1
set this_batch=%~2
set list_file=%~nx3

:: Skip list file and this batch file too
if "%this_batch%"= = "%input_file%" echo Skip this batch file&& goto :EOF
if "%list_file%"= = "%input_file%" echo Skip list file&& goto :EOF

:: Grep for the include file in the list 
findstr /C:"%input_file%" "%excludeFile%" 2>&1 1>NUL

:: Bail out if the input line was in the list file
if not errorlevel 1 echo Skip "%input_file%", it is in %list_file%&& goto :EOF

:: Delete anything left
echo delete file %input_file%&& goto :EOF
goto :EOF

Да, мы могли бы сделать это с меньшим количеством кода, но это (ИМХО) легче читать и контролировать поведение. Другие не согласятся, я уверен. :^P

Señor CMasMas 29.05.2019 18:15

Gracias @Señor CMasMas, но я могу получить эту работу... я не вижу никаких действий, я помещаю ваш код в файл CMD и ничего...

Carlos Costa 29.05.2019 19:05

Кроме того, у @lit есть хорошее решение, но его нет в пакете. Если вам удобно работать с powershell, вы тоже можете попробовать. :)

Señor CMasMas 29.05.2019 19:42

Привет... Это работает. Хорошо.. Могу ли я сначала проверить, существуют ли папка и файл .txt?? Если есть гостариа обработать. Спасибо

Carlos Costa 30.05.2019 14:30

Con mucho gusto amigo. Я добавил его в код выше. ¡Buena suerte!

Señor CMasMas 30.05.2019 17:23

Привет @Señor-CMasMas, не могли бы вы помочь мне с этим... мне также нужно исключить файлы с расширением tmp... Спасибо.. Gracias

Carlos Costa 07.08.2019 13:53

Попробуйте это. Он перебирает содержимое $thedir и удаляет файлы, которых нет в list.txt и которые не являются скриптами. Поместите эти два (2) файла в один и тот же каталог. Лучше не помещать их в тот же каталог, что и удаляемые файлы. Запустите файл .bat из оболочки cmd.exe.

Когда вы убедитесь, что нужные файлы будут удалены, удалите -WhatIf из командлета Remove-Item.

=== Удалить-Except.ps1

$thedir = 'C:\src\t\delexcept'
$precious = (Get-Content -Path (Join-Path -Path $thedir -ChildPath 'list.txt')) +
    @(Join-Path -Path $thedir -ChildPath 'list.txt')

Get-ChildItem -Path $thedir -Exclude 'list.txt','*.ps1','*.bat' |
    Where-Object { (-not $_.PSIsContainer) -and
        ($precious -notcontains $_.FullName) -and
        $_.FullName.StartsWith($thedir) } |
    ForEach-Object { Remove-Item -Path $_.FullName -WhatIf }

=== Удалить-Except.bat

powershell -NoLogo -NoProfile -File "%~dpn0.ps1"

В строке cmd это должно делать

for /f "delims = " %A in ('Dir /B /A-D ^|find /v /i "list.txt"') Do @findstr /IL "%~nxA" list.txt >Nul ||(echo del %A)

Я бы включил переключатель /E с помощью findstr, если последняя строка в list.txt имеет завершающий cr/lf,
иначе последняя запись не будет соответствовать ссылка.

Если вывод выглядит нормально, удалите эхо перед del.

Как пакетный файл:

@Echo off
set "folder=C:\S-ATLANTICO-1\MEDIA"
PushD "%folder%"
set "excludeFile=list.txt"
for /f "delims = " %%A in ('
    Dir /B /A-D ^|find /v /i "%excludefile%"'
) Do findstr /IL "%~nxA" "%excludefile%" >Nul ||(
    echo del %%A
)
Popd

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