Пакетный файл CMD для удаления файла, если он не найден в списке из текстового файла TXT - PullRequest
0 голосов
/ 29 мая 2019

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

В текстовом файле 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"

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

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

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

=== Remove-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 }

=== Remove-Except.bat

powershell -NoLogo -NoProfile -File "%~dpn0.ps1"
0 голосов
/ 30 мая 2019

В строке 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
0 голосов
/ 29 мая 2019

Дайте этому шанс.Это работает для моего тестирования.

Я поместил эхо операторов вместо фактически , удалив что угодно.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...