Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] удалить текст в каждой строке txt файла (http://forum.oszone.net/showthread.php?t=353470)

shadowbat 25-04-2023 05:29 3008072

удалить текст в каждой строке txt файла
 
есть такой код

Код:

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 а второй его обрезка)

shadowbat 25-04-2023 06:43 3008075

решение по 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 3008080

Цитата:

Цитата 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

DJ Mogarych 25-04-2023 09:00 3008081

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

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 3008090

Цитата:

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

она умеет только в cmd окне показывать, а лог в txt это я уже сам дописал

DJ Mogarych 25-04-2023 10:55 3008092

Да, действительно. Можно так попробовать:
Код:

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


megaloman 25-04-2023 11:21 3008093

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 3008094

Цитата:

Цитата megaloman
bat-файл »

прекрасно работает если добавить chcp 1251
а на что влияют кавычки в первых трех строках? я их удалил, всё также работает (и с ними и без них) , обычно если и ставят кавычку то после равно?

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

megaloman 25-04-2023 14:27 3008098

Цитата:

Цитата shadowbat
а на что влияют кавычки в первых трех строках? »

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

megaloman 25-04-2023 15:55 3008110

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 3008115

в последнем коде программа выполнилась, лог создался, но замена (обрезка) в логе не произошла

megaloman 25-04-2023 17:03 3008117

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

shadowbat 25-04-2023 17:13 3008118

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

megaloman 25-04-2023 17:56 3008120

Цитата:

Цитата shadowbat
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 3008121

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

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

megaloman 25-04-2023 19:12 3008126

Цитата:

Цитата shadowbat
но новая первая строка в логе "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
выслал в ЛС »

Пока не понял как поставленная задача совпадает с тем логом

shadowbat 25-04-2023 19:50 3008129

добавление этой строки через
Код:

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

shadowbat 28-04-2023 08:05 3008253

Цитата:

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

вообще говоря пробелы это не такая проблема как спец символы
опытным путём выявлено, что в примере ниже например кавычки в виде "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%



Время: 23:55.

Время: 23:55.
© OSzone.net 2001-