Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] удалить текст в каждой строке txt файла

Старожил


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

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


Изменения
Автор: shadowbat
Дата: 25-04-2023
есть такой код

Код: Выделить весь код
SET NAME=file.bin
programm.exe %NAME% > log.txt
лог сохраняется многострочный
но programm.exe выдает результат в виде таких строк:

(если запущен в текущей папке --- programm.exe file.bin > log.txt)
Код: Выделить весь код
logging result:
file.bin - 111
file.bin - 222222 ABC
file.bin - 33333
file.bin - 4444444444444
end of logging
(если запущен из другой папки --- programm.exe %~1 > log.txt)
Код: Выделить весь код
logging result:
C:\000\Очень длинная папка с пробелами\file.bin - 111
C:\000\Очень длинная папка с пробелами\file.bin - 222222 ABC
C:\000\Очень длинная папка с пробелами\file.bin - 33333
C:\000\Очень длинная папка с пробелами\file.bin - 4444444444444
end of logging
каким кодом сразу после создания лог файла можно удалить из log.txt заранее известный текст (имя файла) в каждой строке? например два алгоритма ниже:
v1 - в данном случае заранее известное %NAME% имя файла --- "file.bin" или "C:\000\Очень длинная папка с пробелами\file.bin" --- удалить или заменить на ""
v2 - узнать длину текста в переменной имени файла %NAME% (судя по этой теме задача тоже не в одну строку) --- в данном случае длина будет равна 8 или 47 --- и удалить с начала каждой строки это количество символов - пара тем с удалением 1 2

чтобы получилось что-то короткое типа:
Код: Выделить весь код
logging result:
 - 111
 - 222222 ABC
 - 33333
 - 4444444444444
end of logging
можно ли такое провернуть сразу после кода с вызовом программы?
что-то типа:
Код: Выделить весь код
programm.exe %NAME% > log.txt
replace_code
или такое можно сделать только в 2 bat файла? (один создание log.txt а второй его обрезка)

Отправлено: 05:29, 25-04-2023

 

Старожил


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

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


решение по v2
компиляция из найденных выше решений

Код: Выделить весь код
chcp 1251
@echo off
programm.exe file.bin > log.txt
call :len len "file.bin"
Setlocal EnableDelayedExpansion
for /f "usebackq delims=" %%a in ("log.txt") do (
set b=%%a
set c=!b:~%len%!
echo !c! >> "crop.txt"
)
goto :eof
:len
set len=%~2
if not "%len%"=="" set /a %1+=1 & call :len %1 "%len:~1%"
goto :eof

Отправлено: 06:43, 25-04-2023 | #2



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата shadowbat:
чтобы получилось что-то короткое типа: »
берем powershell и начинаем готовить:
Код: Выделить весь код
$rep = 'file.bin'
(gc log.txt) -replace "^[^\n]+$rep"|out-file 'out_log.txt'
всё

результат:
Цитата:
logging result:
- 111
- 222222 ABC
- 33333
- 4444444444444
end of logging

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

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

Отправлено: 08:59, 25-04-2023 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Эта программа умеет только в файл выгружать или можно результат поместить в буфер обмена?
Можно тогда будет работать с буфером и обрабатывать его вместо создания промежуточного файла.

Powershell
Код: Выделить весь код
& program.exe $args |set-clipboard
А так - можно и универсальный вариант сделать, на Powershell это в 10 раз проще.
Было
Код: Выделить весь код
logging result:
C:\000\Очень длинная папка с пробелами\file.bin - 111
C:\000\Очень длинная папка с пробелами\file.bin - 222222 ABC
C:\000\Очень длинная папка с пробелами\file.bin - 33333
C:\000\Очень длинная папка с пробелами\file.bin - 4444444444444
end of logging
logging result:
file.bin - 111
file.bin - 222222 ABC
file.bin - 33333
file.bin - 4444444444444
end of logging
Код:
Код: Выделить весь код
$file = 'file.bin'
(gc "d:\temp\log.txt") -replace ".*$file - " -notmatch 'logging'
Стало:
Код: Выделить весь код
111
222222 ABC
33333
4444444444444
111
222222 ABC
33333
4444444444444

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 09:00, 25-04-2023 | #4


Старожил


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

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


Цитата DJ Mogarych:
Эта программа умеет только в файл выгружать или можно результат поместить в буфер обмена? »
она умеет только в cmd окне показывать, а лог в txt это я уже сам дописал

Отправлено: 10:17, 25-04-2023 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Да, действительно. Можно так попробовать:
Код: Выделить весь код
$file = 'file.bin'
(& programm.exe $file) -replace ".*$file - " -notmatch 'logging' > log.txt

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 10:55, 25-04-2023 | #6


Ветеран


Contributor


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

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


bat-файл
Код: Выделить весь код
@Echo Off
	Set "Prog=more.com"
	Set "FName=Z:\000\Очень длинная папка с пробелами\file.bin"
	Set "Log=Z:\Box_Out\log.txt"

	For %%f In ("%FName%") Do Set "Name=%%~nxf"
	>"%Log%" (For /F "usebackq delims=" %%f In (`2^>nul "%Prog%" "%FName%"`) Do Set "Out=%%f" &Call Echo %%Out:*%Name%=%%)
Exit /B
Имя программы, имя файла и лог файла пропишИте свои

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 25-04-2023 в 11:31.

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

Отправлено: 11:21, 25-04-2023 | #7


Старожил


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

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


Цитата megaloman:
bat-файл »
прекрасно работает если добавить chcp 1251
а на что влияют кавычки в первых трех строках? я их удалил, всё также работает (и с ними и без них) , обычно если и ставят кавычку то после равно?

в отличие от первого bat-решения второе bat-решение:
- создаётся не 2 лог файла а только 1 короткий
- обрезается не все строки лога, а только те, где есть имя файла, т.е. более правильная обрезка
- более точно передаются строки в лог и нет больше "Режим вывода команд на экран (ECHO) отключен." вместо некоторых "проблемных" строк
- не работает с именем файла, у которого есть в имени "()", например fi(111)le.bin
- код короче

Последний раз редактировалось shadowbat, 25-04-2023 в 12:44.


Отправлено: 12:15, 25-04-2023 | #8


Ветеран


Contributor


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

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


Цитата shadowbat:
а на что влияют кавычки в первых трех строках? »
Если после окончания строки с именами файлов нет пробелов (в редакторе обычно концевые пробелы не видно), то ни на что. Кавычки - это страховка от пробелов в конце строки, я предпочитаю быть уверенным в том, что в переменной именно то, что я хочу присвоить.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 14:27, 25-04-2023 | #9


Ветеран


Contributor


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

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


shadowbat,
Код: Выделить весь код
@Echo Off
>nul Chcp 1251
	Set "Prog=more.com"
	Set "FName=Z:\000\Очень длинная папка с пробелами\fi(111)le.bin"
	Set "Log=Z:\Box_Out\log.txt"

	>"%Log%" Echo "%FName%"
	For %%f In ("%FName%") Do Set "Name=*%%~xf - "
	Set "FN=%FName:(=^(%"
	Set "FN=%FN:)=^)%"
	>>"%Log%" 2>>&1 (For /F "usebackq delims=" %%f In (`""%Prog%" "%FN%""`) Do Set "Out=%%f" &Call Echo %%Out:%Name%= - %%)
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 25-04-2023 в 16:23.

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

Отправлено: 15:55, 25-04-2023 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] добавить в конце каждой строки txt файла название самого файла rwsct Скриптовые языки администрирования Windows 3 15-11-2021 05:01
CMD/BAT - Удаление последнего символа в каждой строке txt - файла Мария_Айдарова@vk Скриптовые языки администрирования Windows 14 01-08-2019 18:23
Любой язык - как удалить любые две буквы между двумя знаками «>» и «/» в каждой строке в текстовом sergey14235 Скриптовые языки администрирования Windows 4 25-04-2019 16:28
CMD/BAT - [решено] Добавление к каждой строке из файла txt свой текст Acred Скриптовые языки администрирования Windows 9 08-09-2016 04:53
CMD/BAT - [решено] Удаление первых 9 символов в каждой строке TXT файла pzh2393 Скриптовые языки администрирования Windows 1 18-05-2012 16:53




 
Переход