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

maxim43g 09-01-2020 10:25 2904153

Скрипт поздравляющий с днем рождения
 
Добрый день.
Скажите возможно ли, сделать следующее.
Есть файл с датой рождения и Ф.И.О.
есть .vbs скрипт который может отправлять сообщения в домене (msg * /server:" & strComputers(intCounter) & " /time:0 " & strMessage, 0, False)
возможно ли, создать скрипт, который бы каждый день чекал даты из файлы, и если у человека день рождения, то он отправлял бы сообщение вида "Поздравляем с днем рождения + "Ф.И.О. из файла""?

megaloman 09-01-2020 15:22 2904208

maxim43g, В чём загвоздка? Прочесть текстовый файл? Организовать цикл по каждой строке и выделить в ней дату? Сравнить день и месяц с Now? При совпадении отдать полученное в сообщалку? Полученный скрипт поместить в планировщик, чтобы он его ежедневно вызывал.
Чтобы написать функциональный скрипт, хотелось бы иметь текстовый файл, как запускается сообщение (приведенная строка не совсем понятна), смысл параметров при запуске - где сообщение, где адресат. Сообщение посылается всем или конкретному хэппибестдируемому?

Iska 09-01-2020 17:18 2904235

Цитата:

Цитата megaloman
Сообщение посылается всем или конкретному хэппибестдируемому? »

Судя по:
Цитата:

Цитата maxim43g
& strComputers(intCounter) & »

— каждой машине в списке.

maxim43g 10-01-2020 11:36 2904344

Цитата:

Цитата megaloman
maxim43g, В чём загвоздка? Прочесть текстовый файл? Организовать цикл по каждой строке и выделить в ней дату? Сравнить день и месяц с Now? При совпадении отдать полученное в сообщалку? Полученный скрипт поместить в планировщик, чтобы он его ежедневно вызывал.
Чтобы написать функциональный скрипт, хотелось бы иметь текстовый файл, как запускается сообщение (приведенная строка не совсем понятна), смысл параметров при запуске - где сообщение, где адресат. Сообщение посылается всем или конкретному хэппибестдируемому? »

всем в домене
приложил полностью. скрипт

maxim43g 10-01-2020 11:37 2904345

Вложений: 1
вот

megaloman 10-01-2020 17:55 2904401

Вложений: 1
maxim43g,
Проще всего в имеющийся скрипт внедрить функцию, отключив при этом ручной ввод сообщения
Изменения отметил красным цветом
Пропишите свой путь к файлу с списком дней рождения
Отладочную выдачу надо удалить
Полностью Ваш скрипт не тестировал - только кусок
Код:

...................................
...................................
...................................
Option Explicit 
Const ADS_SCOPE_SUBTREE = 2
...................................
...................................
...................................
strMessage = GetBirthDay("Z:\Box_In\birthday.txt")
If strMessage = "" Then Wscript.Quit

MsgBox "Отладка !!!!" + vbcrlf + strMessage

On Error Resume Next
...................................
...................................
...................................

'''''''''' 'Asks the user to type the message

''''''''''strMessage = InputBox("Type the message to be sent to network computer(s)","Messenger Service", strMessage)
''''''''''If strMessage = "" Then
''''''''''        Wscript.Echo "Operation canceled by the user"
''''''''''        Wscript.Quit
''''''''''End If

...................................
...................................
...................................
End Function

Function GetBirthDay(FileIn)
    Dim arrAlls
    Dim strBirth
    Dim intSpace
    Dim datBirth
   
    GetBirthDay = ""
    On Error Resume Next
   
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(FileIn, 1, False)
        If Err.Number <> 0 Then
            Wscript.Echo "File  " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
            On Error GoTo 0
            Exit Function
        End If
        On Error GoTo 0
        arrAlls = Split(.ReadAll, vbCrLf)
        .Close
    End With
    For Each strBirth In arrAlls
        strBirth = Trim(strBirth)
        If strBirth <> "" Then
            intSpace = InStr(1, strBirth, " ")
            If intSpace > 0 Then
                datBirth = Left(strBirth, intSpace - 1)
                If IsDate(datBirth) Then
                    datBirth = CDate(datBirth)
                    If Month(Date) = Month(datBirth) And Day(Date) = Day(datBirth) Then
'                        GetBirthDay = GetBirthDay + vbCrLf + Mid(strBirth, intSpace + 1)
                        GetBirthDay = GetBirthDay + vbCrLf + strBirth
                    End If
                End If
            End If
        End If
    Next
    If GetBirthDay <> "" Then GetBirthDay = "С днём рождения!" + GetBirthDay
End Function

Тестировал на тексте
Код:

15.06.1955 Василий Иванович Пендилюкин

10/01/1900 Дмитрий Донской
jasgjsahg sajaskh lkjsaljl

7.10.1952 Путин Владимир Владимирович
10.01.1600 Чингиз Хан
14.06.1946 Трамп Дональд Фредерикович

Не знаю, как команда msg отреагирует на наличие символов CrLf dв сообщении - я их сделал, чтобы выделить каждого поздравляемого отдельной строкой при совпадении дат дней рождения. При проблемах - заменить
strMessage
на, например,
Replace(strMessage,vbCrLf," === ")
при написании метода Run,
либо при вызове функции
strMessage = Replace(GetBirthDay("Z:\Box_In\birthday.txt"),vbCrLf," === ")

maxim43g 14-01-2020 12:55 2904879

почему то в вашей версии скрипта сообщения не отправляются всем ПК в домене

megaloman 14-01-2020 15:02 2904907

maxim43g, Тестовое сообщение появляется? ("Отладка !!!!" .....)? Может, в этот день нет родившихся?
Я всего лишь заменил в вашем скрипте ручной ввод сообщения, и ничего другого я не трогал
Обязательно замените

strMessage = GetBirthDay("Z:\Box_In\birthday.txt")
на
strMessage = Replace(GetBirthDay("Z:\Box_In\birthday.txt"),vbCrLf," === ")

так как msg неправильно воспринимает символы возврат каретки и перевод строки (CrLf)

Я не стал делать аварийное сообщение, если скрипт не находит реестр с днями рождения - решил, что если помещать скрипт в назначенные задания, это сообщение будет вредно, поэтому, на этапе отладки, я вставил отладочное сообщение, чтобы оценить работу скрипта

Iska 14-01-2020 17:02 2904934

Цитата:

Цитата megaloman
так как msg неправильно воспринимает символы возврат каретки и перевод строки (CrLf) »

Да, в msg.exe технология, которая работала для net.exe send, не работает. Но есть обходной путь:
Код:

@echo off
(
        echo Мама
        echo мыла
        echo раму
) | msg.exe *

exit /b 0

(к сожалению, для кириллицы пакетный файл придётся сохранять в ANSI/1251). Также работает подача на вход msg.exe содержимого внешнего текстового файла.

maxim43g 17-01-2020 09:15 2905406

Цитата:

Цитата megaloman
maxim43g, Тестовое сообщение появляется? ("Отладка !!!!" .....)? Может, в этот день нет родившихся?
Я всего лишь заменил в вашем скрипте ручной ввод сообщения, и ничего другого я не трогал
Обязательно замените
strMessage = GetBirthDay("Z:\Box_In\birthday.txt")
на
strMessage = Replace(GetBirthDay("Z:\Box_In\birthday.txt"),vbCrLf," === ")
так как msg неправильно воспринимает символы возврат каретки и перевод строки (CrLf)
Я не стал делать аварийное сообщение, если скрипт не находит реестр с днями рождения - решил, что если помещать скрипт в назначенные задания, это сообщение будет вредно, поэтому, на этапе отладки, я вставил отладочное сообщение, чтобы оценить работу скрипта »

все заработало, большое спасибо!


Время: 10:48.

Время: 10:48.
© OSzone.net 2001-