1 (изменено: fratz, 2014-04-08 18:50:02)

Тема: VBS: Файл с расширением по почте

Есть VBS-ка, в том виде как есть работает на ура... но...
появилась беда - разработчик программы в обновлении сделал имя отсылаемого файла переменным,
неизменным остается "tdf******.usr"
Как выбрать отправляемый файл по маске ?
Файл с таким началом или расширением всегда один в этой папке.

Set objEmail = CreateObject("CDO.Message")
objEmail.From = "info@main.local.domain"
objEmail.To = "name@yandex.ru"
objEmail.Subject = "User fail" 
objEmail.Textbody = "Automatic mail-sender"

objEmail.AddAttachment "D:\Служебное\Отчёты\tdflas87jhkh.usr" 

objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.1.1"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send

Заранее Большое спасибо за ответы...

2 (изменено: Flasher, 2014-04-12 18:31:17)

Re: VBS: Файл с расширением по почте

Path = "D:\Служебное\Отчёты\"
Set Items = CreateObject("Shell.Application").NameSpace(Path).Items
Items.Filter 192, "tdf*.usr"
If Items.Count = 1 Then
  Web = "http://schemas.microsoft.com/cdo/configuration/"
  With CreateObject("CDO.Message")
    .From = "info@main.local.domain"
    .To = "name@yandex.ru"
    .Subject = "User fail" 
    .Textbody = "Automatic mail-sender"
    .AddAttachment Path & Items.Item(0)
    .Configuration.Fields.Item (Web & "sendusing") = 2
    .Configuration.Fields.Item (Web & "smtpserver") = "192.168.1.1"
    .Configuration.Fields.Item (Web & "smtpserverport") = 25
    .Configuration.Fields.Update
    .Send
  End With
End If

3

Re: VBS: Файл с расширением по почте

Спасибо за отклик на мои страдания!
Попробовал:
Строка 5, Символ 3, Ошибка Неверная или не квалифицированная ссылка

Переместил строку ".AddAttachment Path & Items.Item(0)" за Textbody = ВСЁ РАБОТАЕТ !!!
Низкий поклон !!!

Flasher пишет:
Path = "D:\Служебное\Отчёты\"
Set Items = CreateObject("Shell.Application").NameSpace(Path).Items
Items.Filter 192, "tdf*.usr"
If Items.Count = 1 Then
  Web = "http://schemas.microsoft.com/cdo/configuration/"
  With CreateObject("CDO.Message")
    .From = "info@main.local.domain"
    .To = "name@yandex.ru"
    .Subject = "User fail" 
    .Textbody = "Automatic mail-sender"
    .AddAttachment Path & Items.Item(0)
    .Configuration.Fields.Item (Web & "sendusing") = 2
    .Configuration.Fields.Item (Web & "smtpserver") = "192.168.1.1"
    .Configuration.Fields.Item (Web & "smtpserverport") = 25
    .Configuration.Fields.Update
    .Send
  End With
End If

4

Re: VBS: Файл с расширением по почте

Переместил строку

Пардон, не заметил, на коленке писал.

5

Re: VBS: Файл с расширением по почте

Всем большого здравия!
Продолжу тему - снова появилась задачка (разработчики не дремлють ):
К вышеуказанному письму приложить из другой директории,
последние три созданных файла без расширения...

Сам попробовал - видимо я криворукий - что-то делаю не так...

Всем заранее спасибо за любую помощь !!!

6 (изменено: Flasher, 2015-02-10 20:11:43)

Re: VBS: Файл с расширением по почте

fratz, на будущее - тут лучше выкладывать свои `потуги`, чтобы никто не усомнился в их неголословном существовании.

Path = WScript.Arguments(0) ' пишем путь в строке вызова после скрипта
Last = 3 ' максимальное число последних файлов без расширения

Set FSO = CreateObject("Scripting.FileSystemObject")
For Each F in FSO.GetFolder(Path).Files
  If InStrRev(F.Name, ".") = 0 Then S = S & vbCr & F
Next : If S <> "" Then S = Mid(S, 2)
Mass = Split(S, vbCr) : Max = Ubound(Mass)
If Max >= 0 Then
  If Last > Max Then Last = Max Else Last = Last - 1
  Set Dict = CreateObject("ADODB.Recordset")
  Dict.Fields.Append "Name", 200, 255
  Dict.Fields.Append "Date", 135, 22 : Dict.Open
  For Each F In Mass
    Dict.AddNew : Dict("Name") = F
    Dict("Date") = CStr(FSO.GetFile(F).DateLastModified) : Dict.Update
  Next : Dict.Sort = "Date DESC" : Sort = Split(Dict.GetString, vbCr)
  Web = "http://schemas.microsoft.com/cdo/configuration/"
  With CreateObject("CDO.Message")
    .From = "info@main.local.domain"
    .To = "name@yandex.ru"
    .Subject = "User fail" 
    .Textbody = "Automatic mail-sender"
    For i = 0 to Last
      .AddAttachment Left(Sort(i), InStrRev(Sort(i), vbTab) - 1)
    Next : .Configuration.Fields.Item (Web & "sendusing") = 2
    .Configuration.Fields.Item (Web & "smtpserver") = "192.168.1.1"
    .Configuration.Fields.Item (Web & "smtpserverport") = 25
    .Configuration.Fields.Update : .Send
  End With
End If

7

Re: VBS: Файл с расширением по почте

fratz, ещё маленькое уточнение.
Если нужна именно дата появления файла в папке, а не дата последней правки, то DateLastModified меняем на DateCreated.

8

Re: VBS: Файл с расширением по почте

Flasher'у как Большому Человеку в своём деле - Огромное Благодарю!!!

Flasher пишет:

fratz, на будущее - тут лучше выкладывать свои `потуги`, чтобы никто не усомнился в их неголословном существовании.

Увидев вышеуказанный код, я опешил - не судите строго - я только начинающий, и так далеко ещё не залез, и выкладывать свои потуги - уже считаю смехотворным (и даже постыдным) занятием... (накрутил, явно не туда, да ещё и с КУЧЕЙ ОШИБОК, пытаясь вычислить алгоритм именования файлов, я и по прошлой задаче не сразу во всё въехал, а сейчас, боюсь, неделя уйдёт, минимум, на осознание всего)
Прошу прощения, что два дня не отвечал - шеф замучал.
Пойду грызть гранит науки VBSа...(без учебника не разберусь)

Ещё раз - Спасибо, Большому Брату Flasher'у!!!

9

Re: VBS: Файл с расширением по почте

fratz
Пожалуйста. А какая цель преследуется в изучении? Работоспособность скрипта проверялась? Или с этим тоже какие-то проблемы возникли?

ЗЫ: Про "Большого", конечно, слишком, но ...http://smiles.kolobok.us/artists/laie/Laie_69.gif

10

Re: VBS: Файл с расширением по почте

Flasher пишет:

fratz
А какая цель преследуется в изучении? Работоспособность скрипта проверялась? Или с этим тоже какие-то проблемы возникли?

1. цель научиться делать выборку файлов по параметрам, и управление ими (ренэйм, переброс, отправка по почте)
2.3. Пока что не проверил - пытаюсь разобраться с самим кодом, читаю что и для чего нужно (т.е. мне важнее понять каким образом решать - нежели "решить", подставив нужные значения)

Flasher пишет:

ЗЫ: Про "Большого", конечно, слишком, но ...http://smiles.kolobok.us/artists/laie/Laie_69.gif

Неа, не слишком:
1. примеры грамотного кода на просторах иннета мало где найдёшь.
2. Вы единственный Человек, который вообще отвечает и по сути.
3. отвечаете, пусть даже и лОху в этом деле... (а это говорит о Человеческих качествах)

так что, это я должен http://smiles.kolobok.us/artists/laie/Laie_69.gifhttp://smiles.kolobok.us/artists/laie/Laie_69.gifhttp://smiles.kolobok.us/artists/laie/Laie_69.gif ...

ЗЫ:
мне бы лет 20 назад это всё начать изучать, сейчас бы глупых вопросов не задавал...
а сейчас уже времени на всё не хватает - работа, семья, а учиться по ночам....

11

Re: VBS: Файл с расширением по почте


var re = /^[^.]*$/;
var a = GetFilesPath("d:\\my", re);
WScript.Echo("Files= "+a + "\r\nTotal Count files="+a.length);
WScript.Echo("Last 3 files ="+ a[a.length-1] + "," + a[a.length-2]+","+a[a.length-3]);
WScript.Quit();
///////////////
// DateToString(dateObj,"yyyy.m.d.min");
function DateToString(ds, mask) {
  // WScript.Echo("d="+typeof(d));
  var d = new Date(ds);
  var day = TwoDigits(d.getDate());
  var month = TwoDigits(d.getMonth() + 1);
  var year = d.getFullYear().toString();
  var hours = TwoDigits(d.getHours());
  var minutes = TwoDigits(d.getMinutes());
  var sec = TwoDigits(d.getSeconds());
  var msec = d.getMilliseconds();
  var retval = "";
  if((mask == undefined) || (mask == null) || (mask == "")) {
    retval = year + month + day + hours + minutes + sec + msec;
    return retval;
  }
  retval = mask.replace("sec", sec).replace("min", minutes).replace("dd", day).replace("mm", month).replace("yy", year).replace("hh", hours).replace("sss", hours);
  return retval;
}

///
function GetFilesPath(folderPath, reMask) {
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    var f = fso.GetFolder(folderPath);
    var fc = new Enumerator(f.files);
    var arr = [],
      filePath = "",
      fileName = "";
    for(; !fc.atEnd(); fc.moveNext()) {
      filePath = fc.item().Path;
      fileName = fc.item().Name;
      //WScript.Echo("> " + fc.item().Name);
      if(reMask.test(fileName) == true) {
        //fc.item().DateCreated;
        d = fc.item().DateLastModified; //DateCreated;
        //WScript.Echo("d="+d);
        arr.push(DateToString(d, "yyyy.mm.dd.hh.min.sec.sss") + "|" + fileName);
      }
    }
    arr.sort();
    var returnArray = [],
      i = 0;
    for(i = 0; i < arr.length; i++)
      returnArray.push(arr[i].split("|")[1]);
    return returnArray;
  }
///////
function TwoDigits(s) {
  if(s < 10) {
    s = '0' + s;
  } else {
    s = '' + s;
  }
  return(s);
}

12

Re: VBS: Файл с расширением по почте

fratz пишет:

1. цель научиться делать выборку файлов по параметрам, и управление ими (ренэйм, переброс, отправка по почте)
2.3. Пока что не проверил - пытаюсь разобраться с самим кодом, читаю что и для чего нужно (т.е. мне важнее понять каким образом решать - нежели "решить", подставив нужные значения)

Ага, ясно (кроме "ренэйм, переброс"), тогда разжую неизученную часть кода, чтобы на неделю не растягивать:

+ Код с комментариями:
' параметр для вставки в кнопки/ярлыки вызова - <путь к скрипту.vbs> <путь рабочего каталога>:
Path = WScript.Arguments(0)

Last = 3 ' максимальное число последних файлов без расширения

' создаём объект FSO:
Set FSO = CreateObject("Scripting.FileSystemObject")

' проходимся циклом по всем файлам в папке
For Each F in FSO.GetFolder(Path).Files
' если (ищем с конца строки) не находим точку, то создаём список (S) через возврат каретки (vbCr):
  If InStrRev(F.Name, ".") = 0 Then S = S & vbCr & F
Next

' Если в списке непусто, то убираем из него первый лишний символ vbCr:
If S <> "" Then S = Mid(S, 2)

' создаём массив, разделитель - возврат каретки
Mass = Split(S, vbCr)

' Определяем число элементов массива за вычетом единицы (массивы начинают отсчёт с нуля):
Max = Ubound(Mass)

' Если максимум равен 0 (т.е. 1 шт.) или более, то работа продолжается:
If Max >= 0 Then

' Если заданное число посл. файлов больше максимума массива, то нет смысла брать это число
' Приводим его к максимуму, иначе отнимаем единицу для правильной работы с массивами
  If Last > Max Then Last = Max Else Last = Last - 1

' создаём объект Recordset для создания коллекции полей данных
' см. http://www.script-coding.com/ADO.html#RecordsetObject
' или http://ekinoks.cu.edu.tr/devguru/ADO/recordset_fieldscollection.html
  Set Dict = CreateObject("ADODB.Recordset")

' Добавляем (Append) поле в коллекцию Fields с произвольными названиями "Name" и "Date"
' первый параметр отвечает за тип данных (200 - строковый, 135 - формат даты)
' второй - допустимое число символов (255 - предел для строки и имени файла)
' см. http://www.devguru.com/technologies/ado/8763
' или http://ekinoks.cu.edu.tr/devguru/ADO/recordset_fieldscollection.html
  Dict.Fields.Append "Name", 200, 255
  Dict.Fields.Append "Date", 135, 22

  Dict.Open ' открываем на редактирование

' Проходимся по массиву избранных файлов без расширения
  For Each F In Mass

    Dict.AddNew ' добавляем новую запись 

    Dict("Name") = F ' заносим полное имя файла в поле Name

'   заносим дату модификации в поле Date, приводя запись к строковому типу [CStr(..)]:
    Dict("Date") = CStr(FSO.GetFile(F).DateLastModified)

  Next

' Сортируем поля (столбцы) по дате в обратном (DESC) порядке
  Dict.Sort = "Date DESC"

' Создаём массив, разбивая всю коллекцию полей в строковом (GetString) виде по возврату каретки
  Sort = Split(Dict.GetString, vbCr)

' Пишем постоянную часть URI:
  Web = "http://schemas.microsoft.com/cdo/configuration/"

  With CreateObject("CDO.Message")
    .From = "info@main.local.domain"
    .To = "name@yandex.ru"
    .Subject = "User fail" 
    .Textbody = "Automatic mail-sender"

'   Проходимся циклом с пределом Last по элементам массива Sort:
    For i = 0 to Last

      ' Добавляем файл с полном именем, вырезанным из строки формата <FullFileName><Tab><Date>:
      .AddAttachment Left(Sort(i), InStrRev(Sort(i), vbTab) - 1)

    Next

' Другой метод заключается проходе по списку полей пока указатель не достигнет конца (EOF)
' В этом случае строку Sort = Split(Dict.GetString, vbCr) нужно удалить
'    Do Until Dict.EOF

'      .AddAttachment Dict("Name") ' добавляем файлы с путями, указанными в списке поля/столбца Name

'      выходим из цикла если позиция счётчика станет равна числу посл. файлов:
'      If i = Last Then Exit Do

'      i = i + 1 : Dict.MoveNext ' переходим к след. строке

'    Loop

    .Configuration.Fields.Item (Web & "sendusing") = 2
    .Configuration.Fields.Item (Web & "smtpserver") = "192.168.1.1"
    .Configuration.Fields.Item (Web & "smtpserverport") = 25
    .Configuration.Fields.Update : .Send
  End With

End If

fratz пишет:

Неа, не слишком:
1. примеры грамотного кода на просторах иннета мало где найдёшь.
2. Вы единственный Человек, который вообще отвечает и по сути.
3. отвечаете, пусть даже и лОху в этом деле... (а это говорит о Человеческих качествах)

так что, это я должен http://smiles.kolobok.us/artists/laie/Laie_69.gifhttp://smiles.kolobok.us/artists/laie/Laie_69.gifhttp://smiles.kolobok.us/artists/laie/Laie_69.gif ...

1. Ну, на этом ресурсе грамотного кода разве мало?
2. Это неправда. Иначе у меня самого интереса бы не было здесь появляться.
3. Надеюсь, и остальные тут не чисто с целью поупражняться, но и помочь ближнему. http://smiles.kolobok.us/mini/yes_mini.gif


olmovc2, человек тут на более простом синтаксисе голову ломает, а вы даёте решение в незаданном префиксом коде. Не к 3-й ли это ремарке?