PDA

Показать полную графическую версию : [решено] удалить текст в каждой строке txt файла


shadowbat
25-04-2023, 05:29
есть такой код


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% (судя по этой теме (http://forum.oszone.net/thread-144548.html) задача тоже не в одну строку) --- в данном случае длина будет равна 8 или 47 --- и удалить с начала каждой строки это количество символов - пара тем с удалением 1 (http://forum.oszone.net/thread-234937.html) 2 (https://www.cyberforum.ru/cmd-bat/thread1913684.html)

чтобы получилось что-то короткое типа:

logging result:
- 111
- 222222 ABC
- 33333
- 4444444444444
end of logging


можно ли такое провернуть сразу после кода с вызовом программы?
что-то типа:
programm.exe %NAME% > log.txt
replace_code

или такое можно сделать только в 2 bat файла? (один создание log.txt а второй его обрезка)

shadowbat
25-04-2023, 06:43
решение по 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

YuS_2
25-04-2023, 08:59
чтобы получилось что-то короткое типа: »
берем 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

DJ Mogarych
25-04-2023, 09:00
Эта программа умеет только в файл выгружать или можно результат поместить в буфер обмена?
Можно тогда будет работать с буфером и обрабатывать его вместо создания промежуточного файла.

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

shadowbat
25-04-2023, 10:17
Эта программа умеет только в файл выгружать или можно результат поместить в буфер обмена? »
она умеет только в cmd окне показывать, а лог в txt это я уже сам дописал

DJ Mogarych
25-04-2023, 10:55
Да, действительно. Можно так попробовать:

$file = 'file.bin'
(& programm.exe $file) -replace ".*$file - " -notmatch 'logging' > log.txt

megaloman
25-04-2023, 11:21
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
Имя программы, имя файла и лог файла пропишИте свои

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

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

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

megaloman
25-04-2023, 15:55
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

shadowbat
25-04-2023, 16:53
в последнем коде программа выполнилась, лог создался, но замена (обрезка) в логе не произошла

megaloman
25-04-2023, 17:03
shadowbat, я несколько раз уточнял решение, возьмите актуальное. Я проверил - у меня обрезается на той имитации, что у меня есть.
Покажите свой лог файл.
Я ориентировался на текст ПутьфайлаИмя.расширение - то что надо оставить
в строке пробел-пробел

shadowbat
25-04-2023, 17:13
теперь к логу почему-то добавляется "путь файла" новой первой дополнительной строкой (хотя не должен)
при этом файл отображается в логе, т.е. до программы доходит, программой нормально обрабатывается
т.е. обычный лог, только с доп 1й строкой

megaloman
25-04-2023, 17:56
programm.exe p1 p2 file.bin > log.txt »дайте глянуть этот Ваш лог. Имитировать Вашу программу с параметрами не придумал как. Покажите, как Вы преобразовали мой батник. Попробуйте вот так (полноценно не проверял): @Echo Off
>nul Chcp 1251
Set Prog="programm.exe" p1 p2
Set "FName=C:\111\test6(11!!1)!!22.bin"
Set "Log=C:\111\log.txt"

If Not Exist "%FName%" (Echo File "%FName%" not found &Pause &Exit /B)

>"%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

shadowbat
25-04-2023, 18:12
всё, до меня дошло - мой косяк - вы искали "NAME - " (как указано в примере в 1ом сообщении), сейчас поменяю на "NAME:" как в моём оригинальном логе

теперь имя файла удаляется в строках, но новая первая строка в логе "D:\222\111.bin" никуда не исчезла
да и не критично, будет этакий лог имени внутри самого лога
возможно первую строку создаёт сама программа в связи с особым способом скармливания ей файла

megaloman
25-04-2023, 19:12
но новая первая строка в логе "D:\222\111.bin" никуда не исчезла »хотел как лучше, но получилось как всегда. Я эту строку специально вставил :lol: Ваш батник (раз он работает) с моими корректировками@Echo Off
>nul Chcp 1251
Set Prog="programm.exe" "111.hex" "222.hex" "333.hex"
Set "FName=D:\222\111.bin"
Set "Log=D:\222\111_log_new2.txt"

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выслал в ЛС »Пока не понял как поставленная задача совпадает с тем логом

shadowbat
25-04-2023, 19:50
добавление этой строки через
>"%Log%" Echo "%FName%"
мне следовало и самому заметить, только покурить над кодом подольше
так что да, код официально работает (и работал ещё на прошлой странице, если бы не кривой ТС)

shadowbat
28-04-2023, 08:05
Если после окончания строки с именами файлов нет пробелов (в редакторе обычно концевые пробелы не видно), то ни на что. Кавычки - это страховка от пробелов в конце строки, я предпочитаю быть уверенным в том, что в переменной именно то, что я хочу присвоить. »
вообще говоря пробелы это не такая проблема как спец символы
опытным путём выявлено, что в примере ниже например кавычки в виде "set a=1" помогают не поломаться коду

ломается:
set File=asd sd(11)a asd
if "2"=="2" (
set File2=%File%___2
)
echo %File2%

не ломается, но лишние кавычки в переменной нежелательны:
set File=asd sd(11)a asd
if "2"=="2" (
set File2="%File%___2"
)
echo %File2%

не ломается, без лишних кавычек:
set File=asd sd(11)a asd
if "2"=="2" (
set "File2=%File%___2"
)
echo %File2%




© OSzone.net 2001-2012