Компьютерный форум 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=353812)

Zervan 09-07-2023 03:29 3011928

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

Имеется: несколько файлов script
script_2023-07-06_21-57-54.log
script_2023-07-06_21-59-55.log
script_2023-07-06_22-23-43.log
script_2023-07-06_23-57-11.log
script_2023-07-07_02-24-14.log
script_2023-07-07_04-53-45.log

Т.е. они формируются автоматически после запуска программы и записываются после завершения программы. Но есть нюанс: всегда создается активный (во время работы программы) файл log, который постоянно сам себя обновляет. Его я использовать для создания bat файла не могу (или могу?)
Требуется пройти по всем файлам и выцепить количество строк с определенным содержанием. Строка имеет вид:
SCRIPT : string str = '[TRADER] Player: (Name) DF5gGthyj6OKv_PeDFh6hEEChlIGE-cIFc= #tm_sold Нарукавная повязка (Armband_Black)'
Такие строки могут быть и на 5 линии, и на 21040 линии, т.е. все файлы логов объемные сами по себе

По итогу:
1. Нужно чтобы скрипт прошел по всем файлам
2. Чтобы нашел данную строку и фразу "#tm_sold Нарукавная повязка (Armband_Black)"
3. Вывел количество данных строк по всем файлам в текстовый документ.
4. Не перезаписывал количество уже из проверенных файлов
5. Уходил на повторную проверку через n-время

Меня хватило на следующее для теста, но логично, что база файлов не собирается, а также сохранение происходит криво:
Код:

@echo off

set /a count=0

:top
for /f "usebackq delims=" %%a in ("script*.log") do for %%i in (%%a) do (
if %%i == #tm_sold Нарукавная повязка (Armband_Black) set /a count+=1
)

echo count  : %count%

echo Timeout, next change do 5 sec
timeout /t 5
goto top


Sham 09-07-2023 07:35 3011933

Цитата:

Цитата Zervan
3. Вывел количество данных строк по всем файлам в текстовый документ. »

укажите формат "текстового документа"
Цитата:

Цитата Zervan
4. Не перезаписывал количество уже из проверенных файлов »

противоречит п.3

Zervan 09-07-2023 15:53 3011963

Цитата:

укажите формат "текстового документа"
Любой, но пусть будет Count.txt

Цитата:

противоречит п.3
Не совсем понял... Просто сейчас идет проверка по одному файлу, но нет остальных по списку
А перезаписывание это к вопросу - можно ли сделать так, чтобы файл автоматически добавлял только новые значения.
Сейчас я переписал так, но все еще остальные файлы не подключаются
Код:

@echo off

:top
set /a count=0

for /f "usebackq delims=" %%a in ("script*.log") do for %%i in (%%a) do (
if %%i == привет set /a count+=1
)

echo count  : %count%

echo Timeout, next change do 5 sec
timeout /t 5
goto top


Zervan 09-07-2023 17:10 3011969

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

Sham 09-07-2023 19:12 3011979

Код:

while ($true) {
  $count = 0;
  Get-ChildItem 'c:\dir' 'script_*.log' | Get-Content |
    Select-String -SimpleMatch '#tm_sold Нарукавная повязка (Armband_Black)' | #кодировка
    % { $count++ }
  Write-Host "count: $count"
  Start-Sleep 5
}

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

Zervan 09-07-2023 19:16 3011980

Цитата:

Цитата Sham
while ($true) {
$count = 0;
Get-ChildItem 'c:\dir' 'script_*.log' | Get-Content |
Select-String -SimpleMatch '#tm_sold Нарукавная повязка (Armband_Black)' | #кодировка
% { $count++ }
Write-Host "count: $count"
Start-Sleep 5
} »

А через bat вообще нельзя реализовать? С Powershell не хотят работать нормально другие комбинации

Zervan 09-07-2023 23:40 3012014

Попытался модернизировать свой же код, но в итоге получил много ошибок
Код:

@echo off

:top
set /a count=0

for /f "usebackq delims=" %%a in ("script*.log") do for %%i in (%%a) do (
if %%i == #tm_sold Нарукавная повязка (Armband_Black) set /a count+=1
)

echo count  : %count%

echo Timeout, next change do 5 sec
timeout /t 5
goto top

("script*.log") - пытается найти конкретно этот файл со *, а не общий список из того, что вообще может быть после _
#tm_sold Нарукавная повязка (Armband_Black) - из за # вопринимает строку как отдельный элемент.

Я понимаю, что задача простая, но я никогда не работал с этой историей и сломал голову)


Время: 23:56.

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