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

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

Ответить
Настройки темы
VBS/WSH/JS - [решено] Как создать лог-файл, если при запуске скрипта произошла ошибка?

Аватара для V!RTuE

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


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

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


Помогите, пожалуйста. Вот есть скрипт для отправки почты:
Код: Выделить весь код
strEmail = "mail@mail.ru"
strSMTP = "smtp.mail.ru"
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFSO = Nothing
Set objEmail = CreateObject("CDO.Message")
Dim objTextStream, TXT
Set objTextStream = CreateObject("Scripting.FileSystemObject").GetFile("C:\Report.txt").OpenAsTextStream(1)
TXT = objTextStream.ReadAll()
objTextStream.Close
Set objTextStream = Nothing
objEmail.From = "Рога и копыта <mail@mail.ru>"
objEmail.To = "mail@mail.ru"
objEmail.Subject = " 09-02-2015 17:06:51"
objEmail.Textbody = TXT
objEmail.AddAttachment "C:\START.KEY"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTP
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "mail@mail.ru"
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
objEmail.Configuration.Fields.Update
objEmail.Send
Как сделать, чтобы при ошибке запуска этого скрипта создавался в этой же папке лог-файл, в который записывалась информация об ошибке?
К примеру, при отсутствии файла, который должен быть прикреплен, выдает ошибку:
Код: Выделить весь код
Script: C:\sendmail.vbs
Line: 16
Char: 1
Error: The system cannot find the file specified

Code: 80070002
Source: CDO.Message.1
Вот как сделать, чтобы всю эту информацию записать в лог-файл?

Отправлено: 16:16, 09-02-2015

 

Ветеран


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

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


Цитата V!RTuE:
К примеру, при отсутствии файла, который должен быть прикреплен, выдает ошибку: »
А Вы не оставляйте это на волю случая, проверяйте существование файла, который должен быть прикреплён, внутри скрипта.

Цитата V!RTuE:
Вот как сделать, чтобы всю эту информацию записать в лог-файл? »
Запускайте скрипт посредством «cscript.exe», а не «wscript.exe», и перенаправьте вывод потока ошибок в файл.

P.S. Логику:
Цитата V!RTuE:
Код: Выделить весь код
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFSO = Nothing
»
не понял .

Отправлено: 18:04, 09-02-2015 | #2



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

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


Аватара для V!RTuE

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


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

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


Цитата Iska:
Запускайте скрипт посредством «cscript.exe», а не «wscript.exe», и перенаправьте вывод потока ошибок в файл. »
а как это правильно делается? Так?

Код: Выделить весь код
cscript "С:\sendmail.vbs">"C:\my.log"
Если да, то он пишет только это:
HTML код: Выделить весь код
Microsoft (R) Windows Script Host Version 5.8 Copyright (C) Microsoft Corporation. All rights reserved. C:\cons.exe

Если убрать в коде 4 строки (про которые ниже написал), то запишет без C:\cons.exe
Цитата Iska:
P.S. Логику:
Цитата V!RTuE:
Код:
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFSO = Nothing
»
не понял . »
я неправильно скопировал)) Вот что там у меня. Хотя я уже сам не помню зачем оно надо. Без этих строк тоже всё работает)))
Код: Выделить весь код
echo Dim objFSO
echo Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
echo WScript.Echo objFSO.BuildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), "cons.exe")
echo Set objFSO = Nothing

Отправлено: 18:34, 09-02-2015 | #3


Ветеран


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

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


Цитата V!RTuE:
а как это правильно делается? Так? »
Нет. Так Вы перенаправляете только стандартный поток вывода («stdout»), а надо — поток ошибок («stderr»):
Код: Выделить весь код
cscript.exe "С:\sendmail.vbs" 2>"C:\my.log"
тогда поток вывода пойдёт по-прежнему на консоль, а поток ошибок будет перенаправлен в файл.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:57, 09-02-2015 | #4


Аватара для V!RTuE

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


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

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


Цитата Iska:
А Вы не оставляйте это на волю случая, проверяйте существование файла, который должен быть прикреплён, внутри скрипта. »
у меня основной код в батнике. И там проверка уже реализована на наличие файлов. Вот пример:
Код: Выделить весь код
SET f=%~dp0
if exist "%f%START.KEY" echo objEmail.AddAttachment "%f%START.KEY">>"%f%ARCHIVE\sendmail.vbs"
Просто отправка почты у меня реализована созданием и запуском скрипта из батника
А вообще я не удачный пример привел на счет отсутствия файла. Основная причина, по которой мне надо вести лог ошибки, это когда вообще скрипт не может отработать нормально. Вот например такая ошибка на некоторых компьютерах возникает:
Скрытый текст

И пока не знаю как она решается ((

Отправлено: 19:19, 09-02-2015 | #5


Ветеран


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

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


Цитата V!RTuE:
у меня основной код в батнике. И там проверка уже реализована на наличие файлов. Вот пример: »
Я бы предпочёл делать сие непосредственно в скрипте. И вообще целиком перейти на WSH (или PoSH) с пакетных файлов, нежели пользовать подобную «солянку».

Цитата V!RTuE:
И пока не знаю как она решается (( »
Например, так:
Код: Выделить весь код
Option Explicit

Dim objMessage


On Error Resume Next
Set objMessage = WScript.CreateObject("CDO.Message")

If Err.Number = 0 Then
	On Error Goto 0
	
	'…
	'…
	'…
	
	Set objMessage = Nothing
Else
	Err.Clear
	On Error Goto 0
	
	WScript.Echo "Can't create object [CDO.Message]"
	WScript.Quit 1
End If

WScript.Quit 0
К сожалению, в VBScript нет удобного механизма «try… catch… finally», наличествующего в JScript.

P.S. При использовании механизма перенаправления потока ошибок, описанного выше, стоит писать именно туда, т.е., не:
Код: Выделить весь код
WScript.Echo "Can't create object [CDO.Message]"
а:
Код: Выделить весь код
WScript.StdErr.WriteLine "Can't create object [CDO.Message]"

Отправлено: 20:01, 09-02-2015 | #6


Аватара для V!RTuE

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


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

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


Цитата Iska:
Я бы предпочёл делать сие непосредственно в скрипте. И вообще целиком перейти на WSH (или PoSH) с пакетных файлов, нежели пользовать подобную «солянку». »
Может так и лучше будет, но я не программист (юрист по образованию). Для меня и батники не так легко даются. Ну а во-вторых уж слишком много действий выполняет батник (почти 800 строк кода). А в-третьих, надо сделать универсальным, чтобы работало на любой ОС (от Win 2000 до серверных). Если интересно, и можете подсказать как лучше реализовать, то полную версию батника могу выслать в лс.

Цитата:
Например, так:
Скрытый текст
Option Explicit

Dim objMessage


On Error Resume Next
Set objMessage = WScript.CreateObject("CDO.Message")

If Err.Number = 0 Then
On Error Goto 0

'…
'…
'…

Set objMessage = Nothing
Else
Err.Clear
On Error Goto 0

WScript.Echo "Can't create object [CDO.Message]"
WScript.Quit 1
End If

WScript.Quit 0
а тут вообще не понял куда свой код вставлять (( Знаний по VBS практически нет у меня

Отправлено: 22:12, 09-02-2015 | #7


Ветеран


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

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


Цитата V!RTuE:
А в-третьих, надо сделать универсальным, чтобы работало на любой ОС (от Win 2000 до серверных). »
Тогда только WSH. И всё равно — набор классов Wbem и их свойств и методов различен для разных ОС.

Цитата V!RTuE:
то полную версию батника могу выслать в лс. »
Не стоит.

Цитата V!RTuE:
а тут вообще не понял куда свой код вставлять (( Знаний по VBS практически нет у меня »
Надо учиться. Ваш код должен находиться там, где закомментированные многоточия. Но просто «взять и вставить» не получится.

Отправлено: 02:22, 10-02-2015 | #8


Аватара для V!RTuE

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


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

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


Цитата Iska:
cscript.exe "С:\sendmail.vbs" 2>"C:\my.log" »
Возник еще один вопрос. В лог пишется такая информация:
Код: Выделить весь код
C:\sendmail.vbs(16, 1) CDO.Message.1: The system cannot find the file specified.
а возможно чтобы еще и записывало "Code: 80070002"? Он ведь есть во всплывающем окне.

Отправлено: 07:39, 10-02-2015 | #9


Ветеран


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

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


Цитата V!RTuE:
а возможно чтобы еще и записывало "Code: 80070002"? Он ведь есть во всплывающем окне. »
Нет. Только по вышеописанной методике самому обрабатывать ошибки и писать в stderr любое содержимое из объекта «Err».

Ещё раз повторю: сделайте проверку существования файла в самом скрипте. Это будет проще.

Отправлено: 09:42, 10-02-2015 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
V. 2010 - Ошибка при обновлении Exchange 2010 "Произошла ошибка при выполнении 'ldifde.exe' kudrik_tt Microsoft Exchange Server 0 01-07-2014 08:07
2010 - [решено] При создании сертификата произошла ошибка. Selfcert не удалось создать ваш сертификат okshef Microsoft Office (Word, Excel, Outlook и т.д.) 3 11-11-2010 00:28
[решено] Ошибка при запуске скрипта: error parsing function call klsorat2010 AutoIt 4 24-05-2010 16:04
Ошибка - [решено] Ошибка при запуске скрипта AutoIt 00002010 AutoIt 12 06-03-2010 14:23
Как создать файл с помощью CGI скрипта. lehha Программирование и базы данных 1 20-11-2003 09:48




 
Переход