Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - findstr при записи в тот же файл

Ответить
Настройки темы
CMD/BAT - findstr при записи в тот же файл

Новый участник


Сообщения: 44
Благодарности: 6

Профиль | Отправить PM | Цитировать


Изменения
Автор: TolikD
Дата: 23-08-2018
Описание: покурил перенаправление вывода
Мне нужно удалить заданную строку в текстовом файле. Конкретно нужно удалить ай пи и перезаписать файл без данной строки.
Судя по ману команды findstr делается это так:
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt
Результат будет вывод файла без искомой строки.
Однако, при добавлении кода с записью в тот же самый файл, текст в файле затирается полностью.
Батник:
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt>test.txt
echo Press any key...
pause > nul
Результат: пустой файл test.txt. Что не так делаю?

PS А при чем тут единичка?
Старый текст темы
Как-то давным давно я уже сталкивался с этой проблемой на семёрке, убил в тот раз целый день и пришлось всё делать через зад. А щас то же самое на ДЕСЯТКЕ!!!
Кто-нибудь мне скажет что тут происходит???
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt>test.txt
echo Press any key...
pause > nul
С кодом всё понятно вроде. Здесь командой findstr хочу убрать строку с айпи из файла.
Теперь выполняем батник.
Код: Выделить весь код
C:\debug\cmdtest>findstr /I /V "192.168.1.101" test.txt 1>test.txt

C:\debug\cmdtest>echo Press any key...
Press any key...

C:\debug\cmdtest>pause  1>nul
Главный вопрос: ОТКУДА ЭТА ЕДИНИЧКА???
В результате он мне затирает текст! Или я отстал от жизни или это фича???

Отправлено: 18:55, 23-08-2018

 

Новый участник


Сообщения: 44
Благодарности: 6

Профиль | Отправить PM | Цитировать


Зачем? Я и так мог бы наплодить кучу го%нокода и не подымать тему. Дело принципа. И всё можно, вот решение:
Код: Выделить весь код
for /f "usebackq" %%a in (`findstr /V "192.168.1.101" test.txt`) do (set content=%%a)
echo %content%>test.txt
Всё пашет, тему можно закрыть

Отправлено: 20:54, 23-08-2018 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата TolikD:
Зачем? Я и так мог бы наплодить кучу го%нокода и не подымать тему. »
Если тебе нужна была помощь, то тебе её дали, но именно твой, как ты выразился, го%нокод, точно никому не нужен...
1. Добавь в свой файл несколько строк и увидишь, почему го%нокод (его можно исправить, кстати)
2. Добавь в свой файл тысяч сто строк и замеряй скорость обработки (даже в случае с исправленным вариантом)
3. Посыпать голову пеплом не требуется, но манеры свои, всё же, подправь... на будущее.

-------
scio me nihil scire. Ѫ


Отправлено: 21:03, 23-08-2018 | #12


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата TolikD:
Ну затирает он вначале и что? »
И ничего. В том-то и дело, что НИ-ЧЕ-ГО. Файл становится пустой. И Ваша findstr.exe получает на вход этот самый совершенно пустой файл test.txt.

Цитата TolikD:
Код: Выделить весь код
echo 123>test.txt
почему не затирается? »
Файл как раз таки усекается до нулевого размера. А затем уже в него пишется «123».

Цитата TolikD:
Из скриншота я не понял, и хде там решение проблемы?! »
На скриншоте не решение проблемы, а объяснение её появления — а) почему так, и б) почему именно так, а не иначе.

Решение же банально — разнести чтение из и вывод в один и тот же файл, не делать этого одновременно в пределах одной команды.

Цитата TolikD:
Или я один туплю? »
К сожалению, да. Видно, что Вы не понимаете, как происходит усечение исходного файла test.txt. Ну, давайте попробуем ещё раз:
Цитата TolikD:
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt>test.txt
»
Выделенное начинает выполняться в первую очередь. Что при этом происходит — файл test.txt открывается, и его размер усекается до нуля. В него ещё ничего не выведено, он просто подготовлен для записи. Затем начинает выполняться findstr.exe, читает переданный ей аргумент, открывает этот самый файл test.txt — а там уже пусто. Понимаете? Команде findstr.exe попросту уже нечего фильтровать, файл test.txt пустой, поскольку Вы указали перенаправить в него вывод из той же самой команды.

Цитата TolikD:
в итоге я прав »
Нет.

Цитата TolikD:
Ну есть же решение, только без записи в левый файл. Как это сделать ума не приложу... »
Призовите коллег megaloman и alpap, они делали подобное через группировку команд и фильтры с more.

Цитата YuS_2:
здесь: »
Аааа! Я только предыдущую единичку увидел, в:
Цитата TolikD:
Код: Выделить весь код
C:\debug\cmdtest>findstr /I /V "192.168.1.101" test.txt 1>test.txt
»
а вторую — нет. Спасибо, ясно, разобрался, доглядел .


Цитата TolikD:
И всё можно, вот решение:
Код: Выделить весь код
for /f "usebackq" %%a in (`findstr /V "192.168.1.101" test.txt`) do (set content=%%a)
echo %content%>test.txt
Всё пашет, тему можно закрыть »
Вы издеваетесь? Данный код а) потеряет все пустые строки в файле test.txt, но это не так страшно, как б) сохранит из всего содержимого файла test.txt только его последнюю строку:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

echo --- До... --------------------------
type "test.txt"
echo ------------------------------------

rem Здесь начало Вашего кода
for /f "usebackq" %%a in (`findstr /V "192.168.1.101" test.txt`) do (set content=%%a)
echo %content%>test.txt
rem Здесь окончание Вашего кода

echo --- ...и после ---------------------
type "test.txt"
echo ------------------------------------

endlocal
exit /b 0

Последний раз редактировалось Iska, 23-08-2018 в 21:22.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:08, 23-08-2018 | #13


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
Призовите коллег megaloman и alpap, они делали подобное через группировку команд и фильтры с more. »
Зачем?
тут главное непонятно: зачем именно такое действие, что за религия запрещает применение промежуточного файла?
... в любом случае, представленный выше вариант, это наиболее быстрый вариант.
Можно, конечно, через цикл for такое осуществить (как попытался сделать ТС, пусть и коряво...), т.к. команды, результат которых разбирается в цикле, выполняются в новом процессе, но это очень медленно и неэффективно в итоге, плюс ещё со своими особенностями (такими как съедание пустых строк и т.п.)

-------
scio me nihil scire. Ѫ


Отправлено: 21:23, 23-08-2018 | #14


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Зачем? »
Ну, как — зачем?! Из прынципа! Вы же сами об этом чуть выше пишете.

Отправлено: 21:29, 23-08-2018 | #15


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
Вы же сами об этом чуть выше пишете. »
не-не-не, про прынципы, не мое перо начеркало

-------
scio me nihil scire. Ѫ


Отправлено: 21:36, 23-08-2018 | #16


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
не-не-не, про прынципы, не мое перо начеркало »
«У меня все ходы записаны»™ :
Цитата YuS_2:
Религиозные принципы мешают? »

Отправлено: 21:56, 23-08-2018 | #17


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
У меня все ходы записаны »
А, ну так то вопрос же был, не утверждение...

-------
scio me nihil scire. Ѫ


Отправлено: 22:05, 23-08-2018 | #18


Новый участник


Сообщения: 44
Благодарности: 6

Профиль | Отправить PM | Цитировать


Всё! Товарищ один помог, все недостатки for исправляются параметрами, но всё равно корявенько получилось эт да! Батники в винде, когда дело касается обработки текста - это конечно же ещё та мозголомка башка кипит.
Код: Выделить весь код
setlocal enableDelayedExpansion
set NL=^


set content=
for /f "usebackq delims=: tokens=1* eol=" %%a in (`findstr /V /N "192.168.1.101" test.txt`) do set content=!content!%%b!NL!
echo !content!

Отправлено: 23:56, 23-08-2018 | #19


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата TolikD:
все недостатки for исправляются параметрами, »
Не все.

Цитата TolikD:
но всё равно корявенько получилось эт да! »
Вы даже не представляете — насколько:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set NL=^


set content=
for /f "usebackq delims=: tokens=1* eol=" %%a in (`findstr /V /N "192.168.1.101" test.txt`) do set content=!content!%%b!NL!
>"Result.txt" echo !content!

endlocal
exit /b 0

— добро пожаловать в смешанный мир Windows+Unix! CrLf и Lf в одном флаконе!

Как поведёт себя приложение, которое должно будет работать с получившимся кадавром — вопрос.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:26, 24-08-2018 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - findstr при записи в тот же файл

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Выключается при выполнении memtest Neschur Непонятные проблемы с Железом 2 16-09-2015 00:02
Медиа - Ошибка при выполнении приложения-сервера при открытии мультимедийных файлов Никон_Стадник@vk Microsoft Windows 7 2 01-02-2013 11:22
Лишний сайт при открытии браузер korobka_dv Лечение систем от вредоносных программ 1 06-12-2012 00:45
Ошибка - Ошибка при выполнении cmd KvoD Microsoft Windows 2000/XP 6 26-12-2010 21:55
[решено] Лишний диалог при установке Win2003 S32 Автоматическая установка Windows 2000/XP/2003 3 29-03-2007 13:28




 
Переход