Страница 4 из 4
Добавлено: Сб июн 05, 2010 00:45
AVos002
Забыл указать параметры зауска команды меню «Запуск»:
================================================================
Команда: C:\Program Files\Total Commander\Plugins\tcwhelp_b10\DemoScripts\Proba.vbs
Параметры: %P%N %L
================================================================
Добавлено: Пн июн 07, 2010 10:09
Batya
AVos002 писал(а):Ошибка: Недопустимое число аргументов или присвоение значения свойства: 'GetExtensionName'
Не знаю, что ты запускаешь, но ни в первом, ни во втором скрипте не используется метод "GetExtensionName".
Покажи мне содержимое файла:
AVos002 писал(а):C:\Program Files\Total Commander\Plugins\tcwhelp_b10\DemoScripts\Proba.vbs
Добавлено: Пн июн 07, 2010 11:32
AVos002
Здравствуй Batya!
Как я и предположил, на рабочем компьютере твой скрипт запускается, что за бодяга с домашним компом не понимаю.
Между тем я немного доработал твой скрипт в части перекодировки DOS Windows и получилось вот, что :
Код: Выделить всё
'==============================================================
' Открытие нового сообщния MS Outlook с вложенными файлами
'
' Параметры:
' {файл для комментария} {файл-список файлов для вложения}
'
' Пример параметров при вызове из TC:
' %P%N %L
'==============================================================
Option Explicit
Dim FSO, MSO, MSG, File, List, F
Set FSO = CreateObject("Scripting.FileSystemObject")
File = WScript.Arguments(0)
List = WScript.Arguments(1)
Set MSO = CreateObject("Outlook.Application")
Set MSG = MSO.CreateItem(0)
MSG.Subject = FSO.GetFileName(File) & " [" & GetComment(File) & "]"
MSG.Body = "Добрый день!" & vbCrLf & vbCrLf & _
"---" & vbCrLf & _
"С Уважением, AVos002"
For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
If F <> "" And FSO.FileExists(F) Then
MSG.Attachments.Add F
End If
Next
MSG.Display
Set MSG = Nothing
Set MSO = Nothing
Set FSO = Nothing
WScript.Quit
Function GetComment(pPath)
Const CommFile = "descript.ion"
Dim lPath, lName, lText, lComm
Dim lNameArch
lPath = FSO.GetParentFolderName(pPath) 'получить название полного пути
lName = FSO.GetFile(pPath).Name 'получить название файла
lnameArch=lName
lName = RusDosWin(lName,0)
If Instr(lName, " ") > 0 Then lName = """" & lName & """" 'если в наименовании файла есть пробелы, тогда название заключить в кавычки
If lPath <> "" Then lPath = lPath & "\" 'если наименование пути не пустое, тогда прибавить в конец слэш
If FSO.FileExists(lPath & CommFile) Then 'если файл descript.ion в текущей директории есть, тогда проведем дейстия по поиску комментария
lText = FSO.OpenTextFile(lPath & CommFile).ReadAll 'передать в контейнер (переменной) текст файла descript.ion
lComm = Filter(Split(lText, vbNewLine), lName & " ", True, 1) 'выбрать строку соответствующую наименованию файла
If UBound(lComm) > - 1 Then 'если выбранная строка содержит значение
GetComment = Replace(Mid(lComm(0), Len(lName) + 2), "В", "") 'вырезать (Mid) комментарий и заменить (Replace) значение "В" на пустое
GetComment = Trim(Replace(GetComment, "\n", " "))
Else
GetComment = ""
End If
Else 'если файл descript.ion в текущей директории отсутствует
GetComment = "" 'тогда комментарий пустой
End If
GetComment=RusDosWin(GetComment,1)
End Function
'=========================================================================================================
Function RusDosWin(TextV, CodeV)
' Преобразование КИРИЛЛИЦЫ:
' CodeV = 0 - из DOS в Windows
' = 1 - обратно
' D - константа кодов русских символов для DOS (cp866)
' W - константа кодов русских символов для Windows (cp1251)
' обе константы содержат такую последовательность символов:
' АБВ...Яабв...я
'============================================
Const D = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№"
Const W = "ЂЃ‚ѓ„…р†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ ЎўЈ¤Ґс¦§Ё©Є«¬®Їабвгдежзийклмнопь"
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^¦
' ============================================
If CodeV = 0 Then
RusDosWin = SymChange(TextV, W, D)
Else
RusDosWin = SymChange(TextV, D, W)
End If
'RusDosWin = D
End Function
Function SymChange(TextVal, NewCode, OldCode)
' Перекодировка символов OldCode -> NewCode:
' в переменной TextVal все символы набора OldCode заменяются на соответствующие символы набора NewCode$
' ВНИМАНИЕ! Должно выполняться условие: LEN(NewCode)=LEN(OldCode)
Dim Sym, PromText
Dim Ltext
Dim i, k
Sym = "" ' TextVal
Ltext = Len(TextVal)
If Ltext > 0 Then
For i = 1 To Ltext
PromText = Mid(TextVal, i, 1) 'вырезаем символ из первоначальной строки
If Asc(PromText) > 126 Then 'если код вырезанного символа больше 126 (т.е. требует расшифровки)
k = InStr(OldCode, PromText) 'ищем порядковый номер вхождения вырезанного символа в таблицу OldCode
If k > 0 Then 'тогда, если порядковый номер вхождения более 0 (т.е. найден)
Sym = Sym & Mid(NewCode, k, 1) 'тогда, добавляем к результирующей строке соответствующий символ из NewCode
Else 'если в OldCode соответствующий символ не найден,
MsgBox "Символ «" & PromText & "не найден" 'тогда показать этот символ
end if
Else 'если код вырезанного символа меньше 126
Sym = Sym & PromText 'тогда вставим в результирующкю строку вырезанный символ без изменений
End If
Next
End If
SymChange = Sym
End Function
Надеюсь это не возбраняется?
Добавлено: Пн июн 07, 2010 11:53
AVos002
Batya писал(а):Покажи мне содержимое файла:
AVos002 писал(а):C:\Program Files\Total Commander\Plugins\tcwhelp_b10\DemoScripts\Proba.vbs
Именно этот текст содержится в Proba.vbs
Добавлено: Пн июн 07, 2010 13:40
Batya
AVos002 писал(а):Именно этот текст содержится в Proba.vbs
А ты сейчас дома?
Добавлено: Пн июн 07, 2010 13:52
AVos002
Сейчас я на работе, но если договоримся по времени, могу быть дома.
З.Ы. Как тебе моя дописка в скрипте?
Добавлено: Пн июн 07, 2010 16:41
Batya
AVos002 писал(а):Сейчас я на работе, но если договоримся по времени, могу быть дома.
А чего договариваться? Покажи код файла "C:\Program Files\Total Commander\Plugins\tcwhelp_b10\DemoScripts\Proba.vbs", который дома. Завтра разберёмся.
AVos002 писал(а):З.Ы. Как тебе моя дописка в скрипте?
Главное, чтобы тебя устраивало

У меня в загашнике есть пару методов конвертации. Один похож на твой.
Код: Выделить всё
'Конвертация текста OEM-866 в Win-1251
Function Dos2Win(pDosString)
Dim i, lStr
If Len(pDosString) = 0 Then Exit Function
For i = 1 To Len(pDosString)
lStr = Asc(Mid(pDosString, i, 1))
If lStr >= 128 And lStr <= 175 Then
Dos2Win = Dos2Win & Chr(lStr + 64)
ElseIf lStr >= 224 And lStr <= 239 Then
Dos2Win = Dos2Win & Chr(lStr + 16)
ElseIf lStr = 240 Then
Dos2Win = Dos2Win & Chr(168)
ElseIf lStr = 241 Then
Dos2Win = Dos2Win & Chr(184)
ElseIf lStr = 255 Then
Dos2Win = Dos2Win & Chr(160)
Else
Dos2Win = Dos2Win & Chr(lStr)
End If
Next
End Function
Код: Выделить всё
Set FSO = CreateObject("Scripting.FilesystemObject")
MsgBox StrConv(FSO.OpenTextFile("dos.txt").ReadAll, "ibm866", "windows-1251")
Function StrConv(Text, SourceCharset, DestCharset)
With CreateObject("ADODB.Stream")
.Type = 2
.Mode = 3
.Open
.Charset = DestCharset
.WriteText Text
.Position = 0
.Charset = SourceCharset
StrConv = .ReadText
End With
End Function
Добавлено: Пн июн 07, 2010 17:07
MVV
Самый быстрый способ перекодировки - составить таблицу, где на позиции, соответствующей индексу (коду за вычетом 128) исходного символа будет стоять символ, на который его нужно заменить. Тогда отпадет необходимость в поиске символа в строке, а также в конкатенации строк, нужно будет лишь один раз пройтись по строке и исправить каждый ее символ на символ, указанный в массиве (если скрипт позволяет модифицировать строки). А таблица будет всего на 128 элементов, и строить ее проще простого - пишем в бинарник коды от 128 до 255 и перекодируем в любом редакторе файл из 866 в 1251 - таблица готова!
Код: Выделить всё
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦Lг¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦
(таблица для перекодировки 866->1251, перекодировано в EmEditor; один символ форум передал неверно - неразрывный пробел)[size=0][/size]
Код: Выделить всё
??'?":ЕШ?%?<?????''""--?T?>????яцч?э?ірcт<ї-Rфш+???зъсьу>???хЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬-®Їабвгдежзийклмноп
(таблица для перекодировки 1251->866, перекодировано в EmEditor; три символа форум передал неверно - для букв Ш, а, н)[size=0][/size]
Таким образом, для каждого символа s
исходной строки новый символ равен table[код(s)-128] (или самому себе, если s<128) - небольшой циклик. А таблицу перекодировки лучше передавать в функцию как параметр.
Добавлено: Пн июн 07, 2010 18:10
AVos002
Спасибо MVV, сейчас переварю и попробую сделать на VBScript.
Добавлено: Ср июн 09, 2010 22:54
AVos002
Привет Batya, прошу прощения за паузу, не было возможности зайти на форум.
Batya писал(а):А чего договариваться? Покажи код файла "C:\Program Files\Total Commander\Plugins\tcwhelp_b10\DemoScripts\Proba.vbs", который дома. Завтра разберёмся.
Код: Выделить всё
'==============================================================
' Открытие нового сообщния MS Outlook с вложенными файлами
'
' Параметры:
' {файл для комментария} {файл-список файлов для вложения}
'
' Пример параметров при вызове из TC:
' %P%N %L
'==============================================================
Option Explicit
Dim FSO, MSO, MSG, File, List, F
Set FSO = CreateObject("Scripting.FileSystemObject")
File = WScript.Arguments(0)
List = WScript.Arguments(1)
Set MSO = CreateObject("Outlook.Application")
Set MSG = MSO.CreateItem(0)
MSG.Subject = FSO.GetFileName(File) & " [" & GetComment(File) & "]"
MSG.Body = "Добрый день!" & vbCrLf & vbCrLf & _
"---" & vbCrLf & _
"С Уважением, AVos002"
For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
If F <> "" And FSO.FileExists(F) Then
MSG.Attachments.Add F
End If
Next
MSG.Display
Set MSG = Nothing
Set MSO = Nothing
Set FSO = Nothing
WScript.Quit
Function GetComment(pPath)
Const CommFile = "descript.ion"
Dim lPath, lName, lText, lComm
Dim lNameArch
lPath = FSO.GetParentFolderName(pPath) 'получить название полного пути
lName = FSO.GetFile(pPath).Name 'получить название файла
lnameArch=lName
lName = RusDosWin(lName,0)
If Instr(lName, " ") > 0 Then lName = """" & lName & """" 'если в наименовании файла есть пробелы, тогда название заключить в кавычки
If lPath <> "" Then lPath = lPath & "" 'если наименование пути не пустое, тогда прибавить в конец слэш
If FSO.FileExists(lPath & CommFile) Then 'если файл descript.ion в текущей директории есть, тогда проведем дейстия по поиску комментария
lText = FSO.OpenTextFile(lPath & CommFile).ReadAll 'передать в контейнер (переменной) текст файла descript.ion
lComm = Filter(Split(lText, vbNewLine), lName & " ", True, 1) 'выбрать строку соответствующую наименованию файла
If UBound(lComm) > - 1 Then 'если выбранная строка содержит значение
GetComment = Replace(Mid(lComm(0), Len(lName) + 2), "В", "") 'вырезать (Mid) комментарий и заменить (Replace) значение "В" на пустое
GetComment = Trim(Replace(GetComment, "\n", " "))
Else
GetComment = ""
End If
Else 'если файл descript.ion в текущей директории отсутствует
GetComment = "" 'тогда комментарий пустой
End If
GetComment=RusDosWin(GetComment,1)
End Function
'=========================================================================================================
Function RusDosWin(TextV, CodeV)
' Преобразование КИРИЛЛИЦЫ:
' CodeV = 0 - из DOS в Windows
' = 1 - обратно
' D - константа кодов русских символов для DOS (cp866)
' W - константа кодов русских символов для Windows (cp1251)
' обе константы содержат такую последовательность символов:
' АБВ...Яабв...я
'============================================
Const D = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№"
Const W = "ЂЃ‚ѓ„…р†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ ЎўЈ¤Ґс¦§Ё©Є«¬®Їабвгдежзийклмнопь"
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^¦
' ============================================
If CodeV = 0 Then
RusDosWin = SymChange(TextV, W, D)
Else
RusDosWin = SymChange(TextV, D, W)
End If
'RusDosWin = D
End Function
Function SymChange(TextVal, NewCode, OldCode)
' Перекодировка символов OldCode -> NewCode:
' в переменной TextVal все символы набора OldCode заменяются на соответствующие символы набора NewCode$
' ВНИМАНИЕ! Должно выполняться условие: LEN(NewCode)=LEN(OldCode)
Dim Sym, PromText
Dim Ltext
Dim i, k
Sym = "" ' TextVal
Ltext = Len(TextVal)
If Ltext > 0 Then
For i = 1 To Ltext
PromText = Mid(TextVal, i, 1) 'вырезаем символ из первоначальной строки
If Asc(PromText) > 126 Then 'если код вырезанного символа больше 126 (т.е. требует расшифровки)
k = InStr(OldCode, PromText) 'ищем порядковый номер вхождения вырезанного символа в таблицу OldCode
If k > 0 Then 'тогда, если порядковый номер вхождения более 0 (т.е. найден)
Sym = Sym & Mid(NewCode, k, 1) 'тогда, добавляем к результирующей строке соответствующий символ из NewCode
Else 'если в OldCode соответствующий символ не найден,
MsgBox "Символ «" & PromText & "не найден" 'тогда показать этот символ
end if
Else 'если код вырезанного символа меньше 126
Sym = Sym & PromText 'тогда вставим в результирующкю строку вырезанный символ без изменений
End If
Next
End If
SymChange = Sym
End Function
При запуске ошибка следующая - >
======================
Строка: 78
Символ: 18
Ошибка: Недопустимый знак
======================
Я посчитал координату ошибки - это строка в которой объявляется константа W, символ - р (возможно форум не передает должной кодировки)
Добавлено: Чт июн 10, 2010 02:22
Volniy
Вот
тут у меня была функция
WIN2DOS, уж проще некуда. Так вот в том посте есть ссылка на VBS файл с этой функой. Это чтобы без ошибок с форумными перекодировками.
PS Если вдруг кто не догадается: для версии DOS2WIN нужно лишь поменять местами значения перменных с наборами символов.
Добавлено: Чт июн 10, 2010 10:53
Batya
AVos002 писал(а):Ошибка: Недопустимый знак
Слушай, я всё-таки не понял, а где же ошибка с GetExtensionName?
Проверь сначала работу скрипт без перекодировки.
Если работает, то далее возможны 2 варианта:
1. Использовать какую-нибудь другую функцию перекодирования. Их уже тебе дали достаточно.
2. Перекодировать все descript.ion в Windows-кодировку. Тебе зачем-нибудь ещё нужно в DOS?
Добавлено: Вс ноя 27, 2011 14:06
KarS
Batya
Установил скрипт, выложенный на предыдущей странице топика.
Работает!

У меня Win7, MS Outlook 14.
Большое спасибо за помощь в автоматизации.
