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

Ragnazar 01-09-2012 20:05 1981262

Текстовая константа
 
Код:

Const AnyHere = InputBox("Сообщение", "Заголовок")
Ошибка
Предполагается наличие текстовой константы (литерала)

Исправьте пожалуйста

Iska 02-09-2012 05:13 1981397

Ragnazar, ключевое слово «Const», описывающее последующую за ним константу, не предполагает наличия каких-либо выражений в определяющей части инструкции (после знака равенства).

Так что, используйте «Dim». Тем паче, что, в данном случае, сие и по смыслу должно быть так.
Код:

Dim AnyHere

AnyHere = InputBox("Сообщение", "Заголовок")


Ragnazar 02-09-2012 10:17 1981438

Просто пытаюсь сделать, что-бы пользователь определял функцию
CDO.Message.Configuration.Fields.Item
Обычная переменная не работает.

Точнее не эту функцию а
CDO.Message.From

Iska 02-09-2012 10:58 1981458

Ragnazar, ничего не понятно. Покажите код, который должен работать, но не работает.

Ragnazar 06-09-2012 19:09 1984343

Код:

Const EmailFrom = "От кого"
Const EmailPassword = InputBox "Пароль"
Const strSmtpServer = InputBox "smtp server"
Const EmailTo = InputBox "Кому"
Set objEmail = CreateObject("CDO.Message") 
objEmail.From = EmailFrom
objEmail.To = EmailTo
objEmail.Subject = InputBox "Тема"
objEmail.Textbody = InputBox "Сообщение"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = EmailFrom
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = EmailPassword
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
WScript.Quit

Заменить константы DIMом и SETом не получилось

Iska 06-09-2012 20:17 1984372

Это называется «смешались в кучу кони, люди». Исправлять не стал.

Не проверялось:
Код:

Option Explicit

Dim EmailFrom
Dim EmailPassword
Dim strSmtpServer
Dim EmailTo
Dim objEmail

EmailFrom    = "От кого"
EmailPassword = InputBox("Пароль")
strSmtpServer = InputBox("smtp server")
EmailTo      = InputBox("Кому")

Set objEmail = CreateObject("CDO.Message")

With objEmail
        .From    = EmailFrom
        .To      = EmailTo
        .Subject  = InputBox("Тема")
        .Textbody = InputBox("Сообщение")
       
        With .Configuration.Fields
                .Item("http://schemas.microsoft.com/cdo/configuration/sendusing")        = 2
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
                .Item("http://schemas.microsoft.com/cdo/configuration/sendusername")    = EmailFrom
                .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")    = EmailPassword
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")      = strSmtpServer
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")  = 25
               
                .Update
        End With
       
        .Send
End With

Set objEmail = Nothing

WScript.Quit


Ragnazar 06-09-2012 20:24 1984377

Узнал много нового про With
А Set ObjEmail = Nothing обязательно?
И что такое option explicit?

Iska 07-09-2012 08:07 1984560

Цитата:

Цитата Ragnazar
А Set ObjEmail = Nothing обязательно? »

Старайтесь сразу привыкать освобождать объектные переменные, когда они более не требуются. В данном конкретном случае скрипт всё одно завершает свою работу, так что большой разницы нет. Но в других случаях сие может стать критичным. Так что, как я уже говорил, лучше привыкать делать сие сразу. Привычка — вторая натура.

Вы как бы «говорите», что объектная переменная более не ссылается на область памяти, занятую созданным ранее экземпляром объекта «CDO.Message», и сборщик мусора (Сборка мусора — Википедия) во время очередного прохода сможет освободить эту память и вернуть её в распоряжение системы.

Цитата:

Цитата Ragnazar
И что такое option explicit? »

Это инструкция, декларирующая, что все переменные, содержащиеся в коде, должны быть предварительно объявлены (например, при помощи оператора Dim). Использование данной инструкции позволяет избегать глупых ошибок, возникающих при ошибках написания имён переменных.

Ragnazar 07-09-2012 08:21 1984566

А вот вопрос
Почему
CDO.Message.subject и .textbody
Могут использовать InputBox
А .From .To
Нет? (Сообщалась ошибка "Нужно заполнить хотя-бы одно поле From или To)

Iska 07-09-2012 08:31 1984570

Цитата:

Цитата Ragnazar
Почему CDO.Message.subject и .textbody могут использовать InputBox а .From .To нет? (Сообщалась ошибка "Нужно заполнить хотя-бы одно поле From или To) »

«.From» и «.To» тоже могут.

Ragnazar 07-09-2012 08:39 1984574

но почему-то немогут. Когда ставил там InputBox то все вводилось но в конце была ошибка
Нужно заполнить хотя-бы одно поле From или To

Iska 07-09-2012 08:46 1984576

А что именно Вы вводили в ответ на эти запросы?

Ragnazar 07-09-2012 09:14 1984582

InputBox("Кому","Ttile")

Iska 07-09-2012 10:20 1984615

Я имею в виду, что Вы вводили в ответ на запрос:



?

Ragnazar 07-09-2012 10:32 1984623

don.yari@yandex.ru

Iska 07-09-2012 19:22 1984894

Всё работает.

читать дальше »
Код:

Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic        = 1

Const strPartSchema    = "http://schemas.microsoft.com/cdo/configuration/"

Dim strValue


With WScript.CreateObject("CDO.Message")
        With .Configuration.Fields
                .Item(strPartSchema & "sendusing")        = cdoSendUsingPort
                .Item(strPartSchema & "smtpauthenticate") = cdoBasic
                .Item(strPartSchema & "smtpserver")      = "smtp.mail.ru"
                .Item(strPartSchema & "smtpserverport")  = 25
                .Item(strPartSchema & "sendusername")    = "login"
                .Item(strPartSchema & "sendpassword")    = "password"
               
                .Update
        End With
       
        .To          = InputBox("Кому:",            "Отправка почтового сообщения", "to@yandex.ru")
        .From        = InputBox("От кого:",        "Отправка почтового сообщения", "from@mail.ru")
        .Subject    = InputBox("Тема:",            "Отправка почтового сообщения", "Subject")
       
        Do
                strValue = InputBox("Текст сообщения:", "Отправка почтового сообщения", "(пустая строка завершает ввод текста)")
               
                If Len(strValue) = 0 Then
                        Exit Do
                Else
                        .TextBody = .TextBody & vbCrLf & strValue
                End If
        Loop
       
        .Send
End With

WScript.Quit 0


Ragnazar 08-09-2012 08:46 1985047

Да. Работает

Но я не понимаю принцип строчек (strPartSchema & "sendusing") и других подобных.
Как они разъединились из той первоначальной длинной строки?

Iska 08-09-2012 09:44 1985057

Цитата:

Цитата Ragnazar
Но я не понимаю принцип строчек (strPartSchema & "sendusing") и других подобных.
Как они разъединились из той первоначальной длинной строки? »

Я просто вынес отдельно общую часть всех этих строк, только и всего. Можно было и просто:

Код:

                .Item("http://schemas.microsoft.com/cdo/configuration/sendusing")        = cdoSendUsingPort
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")      = "smtp.mail.ru"
                .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")  = 25
                .Item("http://schemas.microsoft.com/cdo/configuration/sendusername")    = "login"
                .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")    = "password"


Ragnazar 08-09-2012 10:10 1985062

А.
Да. Понял. Не разглядел Set
А зачем do - loop в конце?

Ragnazar 08-09-2012 10:36 1985070

Для нескольких строк. Да

Iska 08-09-2012 11:04 1985076

Да. Ежели не требуется вводить текст сообщения «ручками», можно просто:
Код:

.TextBody = "bla-bla-bla" & vbCrLf & "bla-bla-bla" & vbCrLf & "bla-bla-bla"


Время: 11:25.

Время: 11:25.
© OSzone.net 2001-