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

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

NLOLegion 20-11-2017 16:49 2778921

Ведение лога. Нумерация записей. Смещение записи при появлении новой.
 
Допустим при запуске компа запускается батник записывающий в file.txt дату запуска (или же дату на момент выполнения батника). Дата просто для примера вместо неё может быть запись(копирование) содержимого файла.
Как выполнить подобные записи в лог file.txt таким образом, чтобы каждая новая запись появлялась на новой строчке?
в идеале получить файл с таким по виду содержанием (информация может быть любой, но сейчас просто на примере даты):

1=20.11.2017
2=21.11.2017
3=23.11.2017
4=24.11.2017
5=25.11.2017

Возможно до 10 строк если пяти мне окажется мало.
Но самое важное перезаписывать последнюю строку, а содержимое смещать вверх на одну строчку, то есть значение 5= переместиться на 4=, а 4= на 3=, в итоге значение 1= исчезает так как устаревает.

Iska 20-11-2017 17:07 2778936

Цитата:

Цитата NLOLegion
дату запуска (или же дату на момент выполнения батника). »

А что, они как-то различаются?!

Цитата:

Цитата NLOLegion
Как выполнить подобные записи в лог file.txt таким образом, чтобы каждая новая запись появлялась на новой строчке? »

Отдельной строкой с «echo»:
Код:

set sLogFile=c:\Temp\MyLog.log

>>"%sLogFile%" echo bla-bla-bla1
>>"%sLogFile%" echo bla-bla-bla2
>>"%sLogFile%" echo bla-bla-bla3

Цитата:

Цитата NLOLegion
в идеале получить файл с таким по виду содержанием »

Не вижу никакого смысла в «1=», «2=», «3=» и т.д. А какой смысл вкладываете в сие Вы?

Цитата:

Цитата NLOLegion
Возможно до 10 строк если пяти мне окажется мало.
Но самое важное перезаписывать последнюю строку, а содержимое смещать вверх на одну строчку, »

Зачем Вы хотите организовать такую структуру данных, как очередь?!

И как совместить несовместимое в виде «перезаписывать последнюю строку» и «смещать вверх на одну строчку»?! Либо перезаписывать, либо «выталкивать» первую строку в небытие.

NLOLegion 21-11-2017 07:39 2779139

Цитата:

Цитата Iska
А что, они как-то различаются?! »

Комп и батник всё же могут запускаться в разное время. И вами было упущено что дата для примера.
Цитата:

Цитата Iska
Отдельной строкой с «echo»: »

Работает, спасибо.
Цитата:

Цитата Iska
Не вижу никакого смысла в «1=», «2=», «3=» и т.д. А какой смысл вкладываете в сие Вы? »

нумерация необходима для дальнейшей работы. На данном этапе её можно конечно же упустить, а про нумеровать позднее.
Цитата:

Цитата Iska
очередь?! »

Очередь это самое важное! Возможно это можно как-то реализовать по другому?
Представьте что вам нужно помнить только 5 последних вопросов и по мере их поступления помнить именно 5 последних вопроса. Следовательно ранние надо выбрасывать. Как бы вы Iska, это реализовали?

Iska 21-11-2017 11:05 2779173

Цитата:

Цитата NLOLegion
Комп »

Вот что Вы имели в виду…

Цитата:

Цитата NLOLegion
нумерация необходима для дальнейшей работы. На данном этапе её можно конечно же упустить, а про нумеровать позднее. »

Это ничего не объясняет.

Цитата:

Цитата NLOLegion
Очередь это самое важное! Возможно это можно как-то реализовать по другому?
Представьте что вам нужно помнить только 5 последних вопросов и по мере их поступления помнить именно 5 последних вопроса. Следовательно ранние надо выбрасывать. Как бы вы Iska, это реализовали? »

Это зависит как от задачи, так и от обстоятельств, в частности: как поступают новые вопросы, в каком количестве, каково начальное число вопросов (начинаем ли мы с 0 вопросов, или у нас зараз есть их 5 изначально), что мы должны делать со старыми вопросами (в классическом понимании очереди — при чтении с вершины очереди вопрос оттуда должен убираться, у нас, как я понимаю, нет) и т.д.

Проще говоря, мне надо видеть и понимать Вашу задачу, а не тупо пытаться реализовать выбранное Вами её частичное решение в виде очереди.

NLOLegion 21-11-2017 11:52 2779193

Iska, задача простая. Компьютер записывает через микрофон всё что может распознать и записывает это в txt файл. Каждый запрос перезаписывает предыдущий. Я их собираю в один лог. вашим методом:

set sLogFile=C:\1\file.txt
set /p ansver=<C:\1\1.txt
>>"%sLogFile%" echo %ansver%

Моя цель создать память, но помнить нужно не все, а 5-10 вопросов. Пока решил остановиться на 5. Нужно их постоянно смещать.
Всё более чем банально - работа с очередью. Sed подобное может сделать, но очень криво и не красиво.

Iska 21-11-2017 12:34 2779205

Цитата:

Цитата NLOLegion
Компьютер записывает через микрофон всё что может распознать и записывает это в txt файл »

Как именно это происходит?

NLOLegion 21-11-2017 14:36 2779234

Iska, отправил в гул аудиофайл - получил строчку

Iska 21-11-2017 14:52 2779238

NLOLegion, мне, к сожалению, это почти ни о чём не говорит. Вы могли бы пояснить подробно?

NLOLegion 21-11-2017 15:04 2779239

set sLogFile=C:\1\file.txt
set /p ansver=<C:\1\1.txt
>>"%sLogFile%" echo %ansver%

В C:\1\1.txt одна строчка. с любым содержанием. Содержание перезаписывается различными батниками. Ну например есть батник который очищает корзину, и после этой очистки он записывает в этот C:\1\1.txt строчку "была очищена корзина".
Это содержание перезаписывается в лог C:\1\file.txt. Надо чтобы хранились Последние 5 записей с сохранением порядка поступления.

alpap 21-11-2017 18:00 2779274

NLOLegion,
вы так и не понимаете и сами свою задачу и не понимаете Iska

например этот код
Код:

@echo off
<file.txt>>tmp (find /n /v ""|>nul find "[5]" && more +1& echo Zapis)& >nul move tmp file.txt
pause

если обнаружит при запуске в файле "file.txt" наличие 5й строки, то удалит первую (самую старую) и допишет фразу "Zapis", которая станет 5й строкой, но этот код не управляет процессом записи, а должен. Он должен давать команду на запись, если строк менее 5ти, а если достигли - удалять первую и дозаписывать. Такое реализовать можно, но надо знать что за строки пишутся, как именно, с какой интенсивностью, по одной или может несколько при этом bat должен всегда дежурить с проверкой или проверять на момент запуска. Как видите и с моей стороны тоже вопросов не один.

Iska 21-11-2017 18:46 2779286

NLOLegion, вот что я думаю по этому поводу: никаких «очередей» организовывать не нужно, всё, что потребно, укладывается в рамки существующих концепций: обычного лог-файла или журнала событий. Вы можете использовать что то, что другое. И в том, и в другом случае задача будет фактически состоять в а) добавлении новой записи и б) в извлечении последних N записей. Всё остальное — от лукавого.

NLOLegion 22-11-2017 11:02 2779398

Iska, конечно, можно записывать 6-ую строку к любым 5-ти (даже самому их написать), а потом sed-ом просто удалять 1-ую, и им же нумеровать, но и дураку ясно что это корявая реализация. Результат тот что надо, но вот решение кривое.

alpap,
Цитата:

Цитата alpap
Код:
@echo off
<file.txt>>tmp (find /n /v ""|>nul find "[5]" && more +1& echo Zapis)& >nul move tmp file.txt
pause »

ещё не тестил, но думаю это то что надо!

megaloman 22-11-2017 21:03 2779544

Код:

@Echo Off
If "%~1"=="" Exit /B 222

Set /A N=5
Set "LogFile=Z:\Box_Out\Logfile.txt"
>>"%LogFile%" Echo NN=%~1

Set /A NN=0
FOR /F "usebackq delims=" %%i IN (`more "%LogFile%"`) DO Call Set /A NN+=1
Set /A Nskip=%NN%-%N%
If %Nskip% LSS 0 Set Nskip=0

SetLocal EnableExtensions EnableDelayedExpansion

Set /A NN=0
>"%LogFile%.tmp" (FOR /F "usebackq tokens=2 delims==" %%i IN (`more +%Nskip% "%LogFile%"`) DO Set /A NN+=1 &Echo !NN!=%%i)
move /Y "%LogFile%.tmp" "%LogFile%" >nul

GoTo :Eof

Записываемая строка передаётся в параметре батника, например:

имя_скрипта.bat "тра ля ля"

Если исходного лог-файла не было - он будет создан.
Если исходный лог-файл длинее, чем задано, он будет усечен.
Если исходный лог-файл короче, он будет дописан.
Нумерация будет правильна.

NLOLegion 23-11-2017 11:24 2779638

megaloman, это какое то волшебство батник делает то что мне нужно, но делает это потому что где-то я накривил своими руками, хочется исправить, посмотрите пожалуйста где косяк?

Код:

@Echo Off

set /p ansver=<C:\1\1.txt
If "ansver"=="" Exit /B 222
Set /A N=5
Set "LogFile=C:\1\Logfile.txt"
>>"%LogFile%" Echo %ansver%

Set /A NN=0
FOR /F "usebackq delims=" %%i IN (`more "%LogFile%"`) DO Call Set /A NN+=1
Set /A Nskip=%NN%-%N%
If %Nskip% LSS 0 Set Nskip=0

SetLocal EnableExtensions EnableDelayedExpansion

Set /A NN=0
>"%LogFile%.tmp" (FOR /F "usebackq tokens=2 delims==" %%i IN (`more +%Nskip% "%LogFile%"`) DO Set /A NN+=1 &Echo !NN!=%%i)
move /Y "%LogFile%.tmp" "%LogFile%" >nul

GoTo :Eof

хочу пояснить что в файле из которого копируются данные C:\1\1.txt одна строчка такого содержания(в кавычках) "Распознанная строка = очистить корзину".

Скрипт отшибает всё что идёт до символа "равно", и переносит только "= очистить корзину". Мне в принципе это и надо. Но только здесь, в других подобных задачах нужна вся строка.

megaloman 23-11-2017 12:23 2779654

NLOLegion, Определитесь, что нужно.
В постановке задачи были строки вида:
номер=что-то эдакое
В моём решении при добавлении в лог-файл новой строки перед строкой записывался фиктивный номер NN, то есть новая строка приобретала вид:
NN=что-то новенькое
Вы не обратили на это внимание.
NN в данном случае - это полная фикция, играющая роль номера, вместо него может быть что угодно, например, ку ку, или, как у Вас, часть Вашей строки до знака равно.
Затем скрипт берёт полученное, пропускает с начала необходимое кол-во строк, отбрасывает старые номера= и вписывает необходимые новые.
я не рассчитывал, что на входе будет строка с =, но после Вашего изменения вдруг получилось, то, что Вам нужно и о чём Вы не просили.
Вот вариант. Он сможет обработать входящие строки со знаками равно. В лог-файл они войдут полностью.
Код:

@Echo Off

Set /A N=5
Set "LogFile=Z:\Box_Out\Logfile.txt"
Set "InFile=Z:\Box_Out\1.txt

Set /p ansver=<"%InFile%"
If "%ansver%"=="" Exit /B 222

>>"%LogFile%" Echo NN=%ansver%

Set /A NN=0
FOR /F "usebackq delims=" %%i IN (`more "%LogFile%"`) DO Call Set /A NN+=1
Set /A Nskip=%NN%-%N%
If %Nskip% LSS 0 Set Nskip=0

SetLocal EnableExtensions EnableDelayedExpansion

Set /A NN=0
>"%LogFile%.tmp" (FOR /F "usebackq tokens=1,* delims==" %%h IN (`more +%Nskip% "%LogFile%"`) DO Set /A NN+=1 &Echo !NN!=%%i)
move /Y "%LogFile%.tmp" "%LogFile%" >nul

GoTo :Eof


NLOLegion 23-11-2017 12:44 2779657

megaloman, огромное спасибо за сей шедевр!

megaloman 23-11-2017 13:08 2779664

NLOLegion, Если могут приходить строки как:
нечто=что-то новое
так и:
что-то новое
А в лог-файла надо иметь:
номер=что-то новое
можно добавить одну сроку:
Код:

If "%ansver%"=="" Exit /B 222

FOR /F "tokens=1,*  delims==" %%h IN ("%ansver%") DO If Not "%%i"=="" Set "ansver=%%i"

>>"%LogFile%" Echo NN=%ansver%


NLOLegion 25-11-2017 12:09 2780050

Iska, вы столько раз мне помогали, отвечали на вопросы, что с моей строны будет невежеством не ответить.
Есть программа MSpeech, она выполняет роль голосового ассистента - тоесть при привышении порога громкости она записывает через микрофон речь в аудиофайл и через гугл себе в лог записывает текстовый вариант запроса. Если запрос соответствует записанной в программу команде, то выполняется установленный пользователем какой либо батник, в котором прописано какое-либо действо. При такой работе запрос пользователем не должен содержать лишние слова иначе будет не распознан( не найден в списке записанных пользователем). Но у программы есть возможность запуска батника по умолчанию если команда не найдена. У меня такой батник есть и он работает с логом данной программы. В основном через SED. Этот батник ищет последнюю распознанную строку и если находит установленные мной слова-метки то запускает соответствующие им следующие цепочки батников.
Данная очередь нужна для подлержания памяти. Симуляция речи. Например:
Мой запрос - какая погода?
Комп - сегодня не очень то и холодно
Очередь хронит в пяти строчках мои запросы.
Мой второй запрос - а именно?
Комп - минус 10, солнечно
Мой третий запрос - что надеть?
Комп - что хотите то и одевайте. Мне пофиг.
Каждый раз программа не находя команды запускает батник по умолчанию который дописывает очередь и прорабатывая пять строчек начиная с последней ищет в них слова-метки для дальнейшей реакции - запуска нужного батника выдающего нужный ответ. Или ничего не делает если и в очереди нет нужных меток.


Время: 09:19.

Время: 09:19.
© OSzone.net 2001-