Показать полную графическую версию : [решено] скрипт для создания системы взаимопомощи на дороге
Уважаемые гуру BAT-файлов
прошу помочь в написании скрипта для создания системы взаимопомощи на дороге для одного из автоклубов
при поступлении смс скрипт определяет номер отправителя и если этот номер есть в базе, он формирует смс сообщения для остальных участников
суть:
имеем 3 текстовых файла:
1. in_file.txt - содержит смс принятые gprs-модемом
2. out_file.txt - содержит смс, которые модем должен отправить
3. base.txt - содержит номера телефонов куда отправлять
для взаимодействия с модемом используется отдельная программа
при получении смс, в определенной папке на диске она создает текстовый файл, в который пишет данные вот в таком виде:
http://www.simplesms.ru/wp-content/uploads/desc_re2.gif
на пк постоянно крутиться скрипт на BAT/CMD файле, который:
1. раз в минуту проверяет пришло ли новое сообщение (появилась ли новая строка в файле, либо изменилось ли время изм файла)
2. считывает номер отправителя и текст сообщения в буфер
3. проверяет, есть ли такой отправитель в базе (защита от спама)
4. если отправитель есть - скрипт формирует файл для отправки смс следующего вида:
http://www.simplesms.ru/wp-content/uploads/desc2.gif
каждая строка - это отдельное смс для каждого телефона из базы
5. помещает его в папку отправки
после чего программа работы с модемом отправляет все смс и удаляет файл
сам я давным давно уже ничего подобного не писал, потому обращаюсь за помощью
заранее спасибо
на пк постоянно крутиться скрипт на BAT/CMD файле, который »
Он уже есть, или его как раз надо написать?
Зачем это «либо»:
либо изменилось ли время изм файла) »
?
проверяет, есть ли такой отправитель в базе »
«base.txt» — этот файл?
4. если отправитель есть - скрипт формирует файл для отправки смс следующего вида: »
Непонятен принцип. Что должно быть в сформированной строке?
Он уже есть, или его как раз надо написать? »
его как раз и надо написать
Зачем это «либо»:
Цитата VAFER:
либо изменилось ли время изм файла) »
? »
не знаю, я думал таким образом отслеживать появление новых смс (записей в файле)Цитата VAFER:
проверяет, есть ли такой отправитель в базе »
«base.txt» — этот файл? »
да
формируется вот такой файл:
http://www.simplesms.ru/wp-content/uploads/desc2.gif
в каждой строке будет одно и тоже сообщение (то которое пришло)
а номера разные (из базы)
ну т.е. один из тех кто есть в базе (участник системы) отправляет на сервисный номер смс с текстом:
я такой-то, стою там-то, проблема такая-то
это смс потом отправляется все остальным участникам
программа приема и отправки есть, надо написать скрипт который будет считывать пришедшее смс из текстового файла, а затем формировать текстовый файл для отправки сообщений
Ага. Теперь примерно понятно, что требуется.
Выложите образцы (а не скриншоты) реальных файлов «sms1.txt» и «primer1.txt».
файл in_file.txt (входящие смс, на скриншоте он называется sms1.txt):
Формат файла входящих смс:
дата-время_отправки_смс;номер_отправителя;текст_сообщения
файл out_file.txt (исходящие смс, на скриншоте он называется primer1):
Формат файла исходящих смс:
номер_отправителя;M;R;текст_сообщения
файл base.txt (база данных номеров):
Формат файла:
каждая строчка - номер телефона в формате 7хххххххххх
Весь день изучал форум... голова кругом
в итоге набросал вот такой код (некоторые места не понял как сделать, потому написал просто что нужно)
прошу поправить/подсказать/посоветовать как лучше это реализовать
@echo off
setlocal enabledelayedexpansion
rem считываем базу телефонов из файла base.txt
set i=0
echo база телефонов
for /F "tokens=*" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
echo %%a
)
rem считываем кол-во строк в файле входящих смс и сравниваем с переменной в файле count.txt
set Lines=0
for /F "usebackq" %%L In ("in_file.txt") Do (Set /A Lines+=1)
echo !Lines! входящих смс
FOR /F "tokens=*" %%k in (count.txt) do echo count:%%k
rem если изменилось, то считываем последнюю строку из файла in_file.txt и записываем в файл count.txt новое значение числа входящих смс
IF !k!>!Lines! echo > count.txt
rem считываем файл входящих смс, берем последнюю строку (так и не понял как это сделать)
FOR /F "tokens=2,3 delims=;" %%i in (in_file.txt) do echo num:%%i text:%%j
rem проверяем есть ли телефон отправителя в базе, если есть создаем файл для исходящих смс
FOR /L %%b IN (1,1,кол-во телефонов) DO (
IF te1l==tel2 для каждого телефона из базы set telok=1
)
IF telok=1 FOR /L %%g IN (1,1,кол-во телефонов) DO (
echo %num!g!%;M;R;%%j >> out_file.txt
)
echo работа выполнена
sleep 60
VAFER, в качестве варианта — скрипт WSH на VBScript:
Option Explicit
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = 1
Dim objRecordSet_PhoneNumbers
Dim objRecordSet_Inbox
Dim objRecordSet_Outbox
Dim strConnectionString
Dim lngPrevCount
Set objRecordSet_PhoneNumbers = WScript.CreateObject("ADODB.Recordset")
Set objRecordSet_Inbox = WScript.CreateObject("ADODB.Recordset")
Set objRecordSet_Outbox = WScript.CreateObject("ADODB.Recordset")
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='E:\Песочница\0199';Extended Properties=""text;"""
lngPrevCount = 0
Do
With objRecordSet_Inbox
On Error Resume Next
.Open _
"SELECT Time, PhoneNumber, Message FROM [in_file.txt]", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText
If Err.Number = 0 Then
On Error Goto 0
If .RecordCount > lngPrevCount Then
WScript.Echo "Inbox total: " & CStr(.RecordCount) & ", new: " & CStr(.RecordCount - lngPrevCount)
objRecordSet_Outbox.Open _
"SELECT PhoneNumber, SomeFieldM, SomeFieldR, Message FROM [out_file.txt]", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText
.MoveFirst
.Move lngPrevCount
Do Until .EOF
objRecordSet_PhoneNumbers.Open _
"SELECT PhoneNumber FROM [base.txt] WHERE PhoneNumber = '" & .Fields.Item("PhoneNumber").Value & "'", _
strConnectionString, adOpenStatic, adLockOptimistic, adCmdText
If objRecordSet_PhoneNumbers.RecordCount > 0 Then
objRecordSet_Outbox.AddNew _
Array("PhoneNumber", "SomeFieldM", "SomeFieldR", "Message"), _
Array(.Fields.Item("PhoneNumber").Value, "M", "R", .Fields.Item("Message").Value)
objRecordSet_Outbox.Update
.MoveNext
Else
WScript.Echo "Phone number [" & .Item("PhoneNumber").Value & "] not found in database"
End If
objRecordSet_PhoneNumbers.Close
Loop
objRecordSet_Outbox.Close
lngPrevCount = .RecordCount
End If
.Close
Else
Err.Clear
On Error Goto 0
End If
End With
WScript.Sleep 1000 * 60
Loop
WScript.Quit 0
Вместо «E:\Песочница\0199» укажите Ваш путь к папке с файлами. В той же папке создайте файл «Schema.ini» со следующим содержимым:
[base.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
CharacterSet=ANSI
Col1=PhoneNumber Text
[in_file.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
DateTimeFormat=mm.dd.yy hh:nn:ss
CharacterSet=ANSI
Col1=Time DateTime
Col2=PhoneNumber Text
Col3=Message Text
[out_file.txt]
ColNameHeader=False
Format=Delimited(;)
TextDelimiter=none
DateTimeFormat=mm.dd.yy hh:nn
CharacterSet=ANSI
Col1=PhoneNumber Text
Col2=SomeFieldM Text
Col3=SomeFieldR Text
Col4=Message Text
Ограничения:
1. В текстах сообщений нельзя использовать символ «;». В принципе, это ограничение лечится использованием кавычек для ограничения текстовых строк в файлах «base.txt», «in_file.txt», «out_file.txt»:
04:18:26;"79831501993";"Стою на ленина. Прошу помощи. Макар."
05:18:26;"79831501993";"Стою на Гагарина. Прошу помощи. Игнат."
Это возможно?
2. Файл «out_file.txt» может очищаться, но не должен удаляться. В принципе, можно сделать и обходной путь, ежели никак иначе нельзя.
3. Что такое «M» и «R» в «out_file.txt»?
Iska, спасибо за предложение, но мне все же хотелось реализовать данный алгоритм на BAT/CMD.
Я не представляю, что мне делать с WSH на vbscript, куда его пихать, как запускать ?!
Да и опять надо по новой изучать язык.
Кавычки " увы применить нельзя. Программа работы с модемом не поймет.
M и R - это формат отправки сообщения
М - означает международный формат телефонного номера
R - текст на русском языке
я создал файлы "prog.vbs" и "Schema.ini"
прописал путь к файлам
но как это запустить ???
при простом двойном клике ничего не происходит
при запуске в командной строке висит окно:
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.
и ничего не происходит
я никогда раньше с WSH на vbscript не работал...
Добил всё таки вариант с BAT/CMD :)
@echo off
setlocal enabledelayedexpansion
set telok=0
rem считываем файл входящих смс, берем последнюю строку
FOR /F "tokens=2,3 delims=;" %%c in (in_file.txt) do (
set number=%%c
set textsms=%%d
)
echo %number% %textsms%
rem считываем базу телефонов из файла base.txt и сравниваем номер входящего смс с номерами в базе
set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
IF %%a==%number% set telok=1
)
rem если номер совпал, то опять считываем базу телефонов из файла base.txt и формируем сообщение для каждого номера
IF %telok%==1 (
set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
echo %%a;M;R;%textsms% %number% >> out_file.txt
)
)
rem пауза на 60 сек и опять запускаем сначала всю программу
ping -n 60 127.0.0.1 > nul
call prog2.cmd
осталось придумать как сделать чтобы программа знала что это новое сообщение во входящих
т.к. в этом виде она просто берет последнее сообщение из всех и формирует рассылку
и так каждые 60 сек :)
думал сделать внешний файл "count.txt" в котором хранить текущее количество входящих сообщений
и чтобы программа сравнивала число из файла с числом реальных сообщений в файле
мб есть более элегантные способы ? :)
в итоге получилось вот так:
@echo off
setlocal enabledelayedexpansion
set telok=0
rem проверяем есть ли новые входящие сообщения в autoread
Set Lines=0
For /F "usebackq" %%L In (autoread.txt) Do (Set /A Lines+=1)
Echo входящих сообщений: %Lines%
for /F "tokens=*" %%n in (count.txt) do (
set count=%%n
)
if /i %lines% GTR %count% (
Echo %Lines% > count.txt
Echo есть новые сообщения
) else (
echo нет новых сообщений
goto END
)
rem считываем файл входящих смс берем последнюю строку
FOR /F "tokens=2,3 delims=;" %%c in (autoread.txt) do (
set number=%%c
set textsms=%%d
)
echo %number% %textsms%
rem проверяем есть ли телефон в базе
set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
IF %%a==%number% set telok=1
)
rem если телефон есть формируем рассылку
IF %telok%==1 (
echo телефон есть в базе - формируем рассылку
set i=0
for /F "tokens=1,2 delims=;" %%a in (base.txt) do (
set /A i=!i! + 1
set num!i!=%%a
set name!i!=%%b
echo %%a;M;R;%textsms% телефон для связи %number%
echo %%a;M;R;%textsms% телефон для связи %number% >> C:\simplesms\auto\out_file.txt
)
) else echo такого телефона нет в базе
:END
ping -n 60 127.0.0.1 > nul
call prog2.cmd
приму предложения по оптимизации :)
Iska, спасибо за предложение, но мне все же хотелось реализовать данный алгоритм на BAT/CMD. »
Увольте.
Я не представляю, что мне делать с WSH на vbscript, куда его пихать, как запускать ?! »
Я написал, как.
Кавычки " увы применить нельзя. Программа работы с модемом не поймет. »
Тогда без точки с запятой.
M и R - это формат отправки сообщения
М - означает международный формат телефонного номера
R - текст на русском языке »
Спасибо, ясно.
я создал файлы "prog.vbs" и "Schema.ini"
прописал путь к файлам
но как это запустить ???
при простом двойном клике ничего не происходит
при запуске в командной строке висит окно:
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.
и ничего не происходит »
А что должно происходить-то, я не пойму? Скрипт работает. Ждёт одну минуту, затем проверяет наличие новых сообщений в «in_file.txt». Если они есть — добавляет их в «out_file.txt», сверив каждый номер по списку из «base.txt». Затем снова ждёт. И так — по кругу.
Iska, большое спасибо за участие, но я уже сделал то что мне было нужно на BAT/CMD :)
VAFER, ну, что ж тут поделаешь ;).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.