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

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

Ответить
Настройки темы
CMD/BAT - [решено] Ведение лога. Нумерация записей. Смещение записи при появлении новой.

Пользователь


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

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


Допустим при запуске компа запускается батник записывающий в 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= исчезает так как устаревает.

Отправлено: 16:49, 20-11-2017

 

Ветеран


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

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


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

Отправлено: 18:46, 21-11-2017 | #11



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

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


Пользователь


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

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


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 »
ещё не тестил, но думаю это то что надо!

Отправлено: 11:02, 22-11-2017 | #12


Ветеран


Contributor


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

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


Код: Выделить весь код
@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 "тра ля ля"

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

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


Отправлено: 21:03, 22-11-2017 | #13


Пользователь


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

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


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 одна строчка такого содержания(в кавычках) "Распознанная строка = очистить корзину".

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

Отправлено: 11:24, 23-11-2017 | #14


Ветеран


Contributor


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

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


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

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

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

Отправлено: 12:23, 23-11-2017 | #15


Пользователь


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

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


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

Отправлено: 12:44, 23-11-2017 | #16


Ветеран


Contributor


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

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


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%

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

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

Отправлено: 13:08, 23-11-2017 | #17


Пользователь


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

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


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

Отправлено: 12:09, 25-11-2017 | #18



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Ведение лога запускаемых программ rosalin Скриптовые языки администрирования Windows 12 02-10-2014 13:58
Мультимедиа - ПО для записи с микрофона при появлении звука santey007 Программное обеспечение Windows 4 06-06-2014 20:05
Bandwith/Quota - Windows. Контроль URL, ведение лога в прозрачн.режиме. Чем? Barit Сетевые технологии 2 11-03-2013 11:38
CMD/BAT - [решено] Различные варианты исполнения по выбору. Ведение лога. Kainos Скриптовые языки администрирования Windows 3 11-12-2011 14:10
Установка - при инсталяции Vista Business зависает при появлении ProgressBar. _ib_ Microsoft Windows Vista 5 18-09-2008 05:17




 
Переход