Пакетный файл: очистить каждую строку из нескольких файлов, в которых нет строки?

Мне нужно очистить сразу несколько текстовых файлов, очистив все строки, на которых нет метки строки. Должен быть пакетный файл Windows.

пример:

set string="abcd"
for each *.txt file do (
  if line doesn't have string delete line
)

Я не хочу создавать новые файлы, просто обновляю исходные, удаляя строки, в которых нет строки.

Конечно, вы можете создать временный файл и перезаписать исходный без изменения имени. Неважно, как вы это сделаете, просто результат — те же файлы, но чистые.

благодарю вас


person Hajas    schedule 26.10.2016    source источник
comment
Вы перепутали местоимения. Неважно, как вы изменяете исходный файл. Ведь это ваша работа. И если вы будете искать, как удалить строки из текстового файла, содержащие строку, вы найдете множество существующих примеров.   -  person dbenham    schedule 26.10.2016


Ответы (1)


Отредактировал, исправив ошибки, теперь все работает отлично! ваше здоровье!

@echo off

    set "string_to_find=some string"
    for /f "tokens=*" %%a in ('dir /B *.txt') do (
                set "tempfile=%temp%\%%a"
                if exist "%tempfile%" del "%tempfile%" >NUL
                findstr /C:"%string_to_find%" "%~dp0\%%a" >> "%tempfile%"
                if not errorlevel 1 (
                            del "%%a" >NUL
                            move /Y "%tempfile%" "%~dp0\%%a" >NUL
                            if exist "%tempfile%" del "%tempfile%" >NUL
                            echo File "%~dp0\%%a" processed successfully 
                ) else (
                echo Problem processing file "%~dp0\%%a"
                )
    )
person user2956477    schedule 26.10.2016
comment
делает наоборот, удаляет строки СО строкой, но я хочу сохранить их и удалить остальные. Также выдает ошибку, говоря, что файл не является допустимой командой в этой строке File "%~dp0\%%a" processed successfully, также требуется строка setlocal enableDelayedExpansion раньше, или просто удалит первый файл и выдаст несколько ошибок. это очень близко, как инвертировать выделение? спасибо - person Hajas; 26.10.2016
comment
ошибка, которую я исправил, поместив echo перед строкой, похоже, просто информация для печати, верно? швы проблема в командах del/move, которые говорят часть, которую следует удалить, а не сохранять, удаляя то, что действительно интересует. спасибо - person Hajas; 26.10.2016
comment
удалил /V в команде findstr и работает нормально! спасибо - person Hajas; 26.10.2016
comment
Вы правы, моя ошибка с опцией /V, и забудьте одно «эхо». извинения - person user2956477; 26.10.2016
comment
setlocal enableDelayedExpansion не обязательно, потому что ни один из !vars! используются. Но тут не пробовал... - person user2956477; 26.10.2016
comment
ты прав! не нужно setlocal enableDelayedExpansion спасибо! :D - person Hajas; 27.10.2016
comment
У меня СТРАННАЯ ошибка, иногда выдает ошибку о том, что файл/путь не найден... затем после выполнения несколько раз просто работает. - person Hajas; 27.10.2016
comment
неважно, это были просто права доступа к файлам, которые были исправлены, если я запускаю другую летучую мышь для тестирования, а затем ваши работают только после этого. Предоставление и снятие защиты от записи исправили все исходные файлы. ваше здоровье - person Hajas; 27.10.2016
comment
небольшая проблема, если я запускаю CMD, все работает нормально, но если я просто дважды щелкну файл, выдается ошибка, что файлы не найдены. Попытался удалить `\` на частях %~dp0\%%a, а в стороне также работает в CMD, все так же под окнами. Существует решение этого? Благодарность - person Hajas; 06.11.2016
comment
Не знаю, почему это просто перестало работать, теперь просто не могу найти временные файлы, проблема только с временными файлами... :( - person Hajas; 11.08.2017