-1

Существует текстовый файл, который содержит (среди многих других) строки, которые начинаются с:

"ЧЧ: ММ: СС"

где H, M, S - часы, минуты и секунды (в 24-часовом формате).

Существуют файлы .jpg с именами HHMMSS.jpg или HHMMSSxy.jpg (где x, y - цифры и / или буквы).

Как удалить все файлы HHMMSS * .jpg, имена которых НЕ соответствуют строкам "HH:MM:SS case" в файле .txt? Я могу легко найти все существующие строки "HH:MM:SS case" в файле .txt, но не знаю, что дальше.

Пакет DOS будет использоваться на машине XP.

PS Уважаемые люди, я ничего не знаю о скриптах. Это не мой мир. Я понимаю, что вы не "компания сценаристов", но я надеюсь, что это очень просто для людей, которые знают это.

Что я сделал.

Я могу найти все эти строки по: findstr /r /c: "..: ..: .. case"

Я могу поместить их в другой файл .txt, добавив в конце:> file.txt

Я пробовал несколько кодов с командой "for", но синтаксис для меня слишком сложный.

Я знаю, как преобразовать HH:MM:SS в HHMMSS (и сделать еще один текстовый файл с ними).

Я нашел несколько кодов для удаления файлов из каталога в соответствии со списком в текстовом файле.

Но я чувствую, что это очень грубый путь.

2 ответа2

0

ОК, прошло некоторое время, но теперь это работает. Это сделано для щелчка правой кнопкой мыши на папке (я сделал правое нажатие на меню в реестре).

cls
@ECHO OFF
setlocal enabledelayedexpansion

SET SourcePath=%1
SET WorkPath=%SourcePath%\TempWork

CD /D %SourcePath%

IF NOT EXIST "%WorkPath%" MD "%WorkPath%"
IF EXIST "%WorkPath%\*.bmp" DEL /Q /F "%WorkPath%\*.bmp"
XCOPY /F /Y "%SourcePath%\*mask*.bmp" "%WorkPath%\"


IF EXIST RawList.txt DO DEL RawList.txt
IF EXIST List.txt DO DEL List.txt

for /f "delims=" %%A in ('cd') do set foldername=%%~nxA

FINDSTR /r /c:"..:..:.. case"  %foldername%.log > RawList.txt


for /f  "delims=" %%a in (RawList.txt) do (
set str=%%a
set str=!str::=!
set str=!str:~0,6!
echo !str!
) >> List.txt



FOR /F "TOKENS=*" %%A IN (

List.txt

) DO (

CALL :Routine1 "%%~NXA*.bmp"

)

DEL /Q /F  "%SourcePath%\*.bmp"

XCOPY /F /Y "%WorkPath%\*.bmp" "%SourcePath%\"
IF EXIST "%WorkPath%\*.bmp" DEL /Q /F "%WorkPath%\*.bmp"

RD /Q /S %WorkPath%

DEL /Q /F RawList.txt
DEL /Q /F List.txt

GOTO :EOF

:Routine1 
XCOPY /F /Y "%SourcePath%\%~1" "%WorkPath%\"
GOTO :EOF
0

Удалять файлы, если имена не соответствуют частям строк в текстовом файле - Пакет Windows

Я могу найти все эти строки по: findstr /r /c: "..: ..: .. case"

Я могу поместить их в другой файл .txt, добавив в конце:> file.txt

Я пробовал несколько кодов с командой "for", но синтаксис для меня слишком сложный.

Я собрал цикл FOR /F, который использует этот file.txt со строками, которые вы создаете, чтобы перебрать эти значения содержимого этого файла, чтобы временно скопировать строки (как имена файлов) с добавленным .jpg другом месте (первоначально он удалил те ) - это то, что вы подтвердили, что работаете и повторяете команду удаления из моих комментариев.

Ваш комментарий

удаляет файлы jpg, находящиеся в текстовом файле. Теперь, как я хочу, чтобы не удалить эти файлы, но чтобы удалить все остальные

Список строк повторяется, поэтому я не уверен, как легко добавить логику IF пакетного сценария и сказать удалить этот файл (один за другим), если он не равен ЛЮБОМУ значению строки из списка строк имени файла (один- один на один здесь бы не работал)- PowerShell был бы другой историей, хотя я уверен.

Таким образом, копирование в метод временного рабочего каталога, кажется, работает хорошо, поэтому протестируйте его и посмотрите, как оно работает, но когда я запустил его несколько раз, он работал так же, как и ожидалось с тем, как у меня есть логика в примере пакетного сценария, чтобы получить окончательный и ожидаемый результат, как вы объяснили через оригинальный вопрос и ваши комментарии впоследствии.

Обратите внимание, что вам НУЖНО запускать этот файл как файл .bat или .cmd а не копировать и вставлять его в командную строку вручную, поскольку для этого метода требовалась команда CALL .


Пример пакетного скрипта

@ECHO ON

SET SourcePath=C:\Path
SET WorkPath=C:\Path\TempWork

IF NOT EXIST "%WorkPath%" MD "%WorkPath%"
IF EXIST "%WorkPath%\*.jpg" DEL /Q /F "%WorkPath%\*.jpg"

FOR /F "TOKENS=*" %%A IN (

    C:\Path\file.txt

) DO (

    CALL :Routine1 "%%~NXA.jpg"

)

DEL /Q /F  "%SourcePath%\*.jpg"
XCOPY /F /Y "%WorkPath%\*.jpg" "%SourcePath%\"
IF EXIST "%WorkPath%\*.jpg" DEL /Q /F "%WorkPath%\*.jpg"
GOTO EOF

:Routine1 
XCOPY /F /Y "%SourcePath%\%~1" "%WorkPath%\"
GOTO EOF

Примечания сценария /Gotchas:

  • Вы можете использовать только имя файла со строковыми значениями (file.txt) или полный путь. Только убедитесь, что вы НЕ ставите двойные кавычки вокруг этого, иначе он не читает значения содержимого файла. Это может означать, что если вы используете полный путь, а не неявное имя файла для file.txt то этот путь, включая любые имена папок и имя файла, НЕ ДОЛЖЕН содержать пробелов.
  • Убедитесь, что SET SourcePath=C:\Path равен допустимому пути к файлу (здесь или без пробелов все в порядке), где существуют файлы, которые вы хотите сохранить (исходный путь).
  • Убедитесь, что SET WorkPath=C:\Path\TempWork соответствует допустимому пути к файлу (с пробелами или без них, здесь хорошо), где файлы, которые вы хотите сохранить, будут временно скопированы до тех пор, пока другие файлы не будут удалены, а затем скопированы обратно в исходный путь к источнику.
  • Вам нужно будет убедиться, что контекст безопасности, выполняющий этот пакетный сценарий, имеет доступ ко всем применимым файлам и папкам для успешной обработки всех операций логики пакетной команды.

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