|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Обработка ошибки открытия |
|
VBS/WSH/JS - Обработка ошибки открытия
|
Новый участник Сообщения: 16 |
Профиль | Отправить PM | Цитировать В код нужно добавить фрагмент обработки ошибки открытия в случае неверного указания пути или имени файла с выводом сообщения об этом
вот сам код: Option Explicit Dim strDestFile Dim objTS Dim objFolder With WScript.CreateObject("Scripting.FileSystemObject") strDestFile = .BuildPath(WScript.CreateObject("WScript.Shell").SpecialFolders.Item("MyDocuments"), "текстовый файл.txt") If .DriveExists("C:") Then Set objTS = .CreateTextFile(strDestFile, True, True) For Each objFolder In .GetFolder("C:\").SubFolders objTS.WriteLine ComposeAttributesString(objFolder.Attributes) & vbTab & objFolder.Name Next objTS.Close Set objTS = Nothing Else WScript.Echo "Drive C: not exists." WScript.Quit 1 End If End With WScript.Quit 0 Function ComposeAttributesString(intAttributes) Dim strResult strResult = "" If intAttributes And 16 Then strResult = strResult & "D" Else strResult = strResult & " " If intAttributes And 2048 Then strResult = strResult & "C" Else strResult = strResult & " " If intAttributes And 1024 Then strResult = strResult & "L" Else strResult = strResult & " " If intAttributes And 32 Then strResult = strResult & "A" Else strResult = strResult & " " If intAttributes And 4 Then strResult = strResult & "S" Else strResult = strResult & " " If intAttributes And 2 Then strResult = strResult & "H" Else strResult = strResult & " " If intAttributes And 1 Then strResult = strResult & "R" Else strResult = strResult & " " ComposeAttributesString = strResult End Function |
|
Отправлено: 21:45, 19-09-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать daniil_im, «неверного указания пути» в этом коде быть не может, ибо путь к «Мои документы» задаётся функциями операционной системы. Имя файла указывается напрямую в коде. Что тут может быть «неверного»?!
Ну, хорошо. Предположим, мы настолько тупы, что указали в коде недопустимые символы в имени файла: strDestFile = .BuildPath(WScript.CreateObject("WScript.Shell").SpecialFolders.Item("MyDocuments"), "текстовый ::: файл.txt")
Скрытый текст
Option Explicit Dim strDestFile Dim objTS Dim objFolder With WScript.CreateObject("Scripting.FileSystemObject") strDestFile = .BuildPath(WScript.CreateObject("WScript.Shell").SpecialFolders.Item("MyDocuments"), "текстовый ::: файл.txt") If .DriveExists("C:") Then On Error Resume Next Set objTS = .CreateTextFile(strDestFile, True, True) If Err.Number <> 0 Then WScript.Echo "Can't create text file [" & strDestFile & "]." & vbCrLf & "Error: " & Err.Description Err.Clear On Error Goto 0 WScript.Quit 2 Else On Error Goto 0 End If For Each objFolder In .GetFolder("C:\").SubFolders objTS.WriteLine ComposeAttributesString(objFolder.Attributes) & vbTab & objFolder.Name Next objTS.Close Set objTS = Nothing Else WScript.Echo "Drive C: not exists." WScript.Quit 1 End If End With WScript.Quit 0 Function ComposeAttributesString(intAttributes) Dim strResult strResult = "" If intAttributes And 16 Then strResult = strResult & "D" Else strResult = strResult & " " If intAttributes And 2048 Then strResult = strResult & "C" Else strResult = strResult & " " If intAttributes And 1024 Then strResult = strResult & "L" Else strResult = strResult & " " If intAttributes And 32 Then strResult = strResult & "A" Else strResult = strResult & " " If intAttributes And 4 Then strResult = strResult & "S" Else strResult = strResult & " " If intAttributes And 2 Then strResult = strResult & "H" Else strResult = strResult & " " If intAttributes And 1 Then strResult = strResult & "R" Else strResult = strResult & " " ComposeAttributesString = strResult End Function |
Отправлено: 22:20, 19-09-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 18
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Имеется скрипт vbs который сравнивает документы которые сдают обучающиеся. Dim path, WshShell 'Объявляем переменные Set WshShell = WScript.CreateObject("WScript.Shell") 'Создаем объект для пути path = WshShell.CurrentDirectory & "\" 'Путь до скрипта и файлов Set Application = CreateObject("Word.Application") ' Создаём объект с Word-ом Application.Visible = False ' делаем НЕвидимым Word Set Proveri = Application.Documents.Open(path & "doc1.docx", , False, , , , , , , , , True) Set Obrazec = Application.Documents.Open(path & "doc2.docx", , False, , , , , , , , , True) Set doc3 = Application.CompareDocuments(Proveri, Obrazec, , False, , , , , , , , , True) doc3.SaveAs(path & "doc3.docx") Application.Quit ' закрываем Word |
|
Отправлено: 17:27, 13-01-2019 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата kosmonavtom:
Цитата kosmonavtom:
|
||
Отправлено: 18:07, 13-01-2019 | #4 |
Ветеран Сообщения: 2726
|
Профиль | Отправить PM | Цитировать kosmonavtom, Не сильно изучал Ваши коды, однако, как идея, перед открытием документа с расширением .DOCX в WORD, проанализировать, не является ли он .RTF
Вот пример функции для такого анализа
File1 = "Z:\Box_In\doc1.docx" File2 = "Z:\Box_In\doc2.docx" File3 = "Z:\Box_In\doc2.docx" File4 = "Z:\Box_In\docx.docx" File5 = "Z:\Box_In\rtf.docx" File6 = "Z:\Box_In\rtf.rtf" MsgBox CStr(RTF(File1)) + vbCrLf + File1 MsgBox CStr(RTF(File2)) + vbCrLf + File2 MsgBox CStr(RTF(File3)) + vbCrLf + File3 MsgBox CStr(RTF(File4)) + vbCrLf + File4 MsgBox CStr(RTF(File5)) + vbCrLf + File5 '------------------------------------------ Function RTF(Fname) ' RTF=1 Файл .rtf ' RTF=0 Файл не .rtf ' RTF=-1 Файл не найден ' RTF=-2 Ошибка при открытии Файла Set FSO = CreateObject("Scripting.FileSystemObject") If Not FSO.FileExists(Fname) Then RTF = -1 Exit Function End If On Error Resume Next Set iFile = FSO.OpenTextFile(Fname, 1, False) If Err.Number <> 0 Then RTF = -2 On Error GoTo 0 Exit Function End If AllTxt = iFile.ReadLine iFile.Close AllTxt = LCase(Mid(AllTxt, 1, 5)) RTF = 1 If Not AllTxt = "{\rtf" Then RTF = 0 End If Set AllTxt = Nothing End Function |
|
------- Отправлено: 22:14, 13-01-2019 | #5 |
Новый участник Сообщения: 18
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Но нашел решение вида: On Error Resume Next 'Запускаем обработчик ошибок Err.Clear 'Очищаем все ошибки Set Proverk = Application.Documents.Open(path & "doc1.docx", , False, , , , , , , , , True) If Err.Number = 0 Then ' Если ошибки нет то... ' Организуем проверку документа Else ' Выводим в файл с результатом, что файл открывается с ошибкой End If |
|
Отправлено: 22:23, 13-01-2019 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата kosmonavtom:
Цитата kosmonavtom:
а) перед открытием проверить, существует ли этот файл в принципе, дабы не путаться в видах ошибок (коллега megaloman, впрочем, реализовал сию проверку зараз внутри функции); б) вернуть стандартную обработку ошибок (On Error Goto 0) сразу после открытия файла и обработки ошибок. megaloman, можно и просто: |
||
Отправлено: 23:58, 13-01-2019 | #7 |
Новый участник Сообщения: 18
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Можно. Только не забудьте: а) перед открытием проверить, существует ли этот файл в принципе, дабы не путаться в видах ошибок (коллега megaloman, впрочем, реализовал сию проверку зараз внутри функции); б) вернуть стандартную обработку ошибок (On Error Goto 0) сразу после открытия файла и обработки ошибок. » Спасибо за подсказки! В общем вот что получилось: ' Сравнение нескольких пар документов запуск сравнения и сохранение результатов сравнений в один файл Dim WshShell 'Объявляем переменные Dim objFSO ' переменная для файлов Dim strSourceFile ' Переменная для проверки есть ли файл с ответами Dim ArrProverk ' Массив для имен файлов проверки Dim ArrObrazec ' Массив для имен файлов образцов ' Нужно вприсать изменения (имена файлов, папок) в эту область: ArrProverk = Array("Pro1.docx", "Pro2.docx", "Pro3.docx", "Pro4.docx") ' Запиши имена файлов которые нужно сравнить ArrObrazec = Array("Obr1.docx", "Obr2.docx", "Obr3.docx", "Obr4.docx" ) ' Запиши имена файлов образцов (в том-же порядке) pathObr = "C:\doc\" 'Запиши путь до файлов образцов ItogoviRezultat = "Itogovi_Rezultat.docx" 'Запиши имя файла для результата проверки Set WshShell = WScript.CreateObject("WScript.Shell") 'Создаем объект для пути pathPro = WshShell.CurrentDirectory & "\" 'Определяем путь до скрипта и файлов проверки (там куда нужно записать этот скрипт и запускать) Set oDoc = CreateObject("Word.Application") ' Создаём объект с Word-ом oDoc.Visible = False ' делаем НЕвидимым Word Const wdStory = 6 ' Константа для добавления новой страницы Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект проверки наличия файла Set ItogRezult = oDoc.Documents.Add() ' Добавляем документ Для записи итоговых результатов ItogRezult.SaveAs(pathPro & "Itogovi_Rezultat.docx") 'Сохраняем Документ ItogRezult.Close 'закрываем Документ n=0 'Переменная для цикла (перебор элементов массива т.е. всех файлов) FOR Each Item in ArrObrazec strSourceFile = pathPro & ArrProverk(n) ' Записываем новый файл в переменную для проверки Set ItogRezult = oDoc.Documents.Open(pathPro & ItogoviRezultat) ' Добавляем документ Для записи итоговых результатов Set oSelectionPlace = oDoc.Selection ' Получаем доступ к выделенной области oSelectionPlace.EndKey wdStory ' Проверяем конец документа (Литература: https://stackoverrun.com/ru/q/8591117) oSelectionPlace.InsertBreak ' Добавляем новую страницу в конце документа oSelectionPlace.TypeText "Результат проверки файла: " & strSourceFile ' Вводим текст (заголовок) в начале новой страницы oSelectionPlace.Style = "Заголовок 1" oSelectionPlace.TypeParagraph() ' Добавляем новый абзац If objFSO.FileExists(strSourceFile) Then '[если файл существует то выполнить эти команды:] On Error Resume Next 'Запускаем обработчик ошибок Set Proverk = oDoc.Documents.Open(strSourceFile, , False, , , , , , , , , True) If Err.Number = 0 Then 'Если ошибки нет то On Error Goto 0 ' Отключение обработчика ошибок см. http://www.cyberforum.ru/vba/thread735309.html Set Obrazec = oDoc.Documents.Open(pathObr & ArrObrazec(n), , False, , , , , , , , , True) Set PromRezult = oDoc.CompareDocuments(Proverk, Obrazec, , False, , , , , , , , , True) 'Записываем промежуточный результат сравнения ' Закрываем проверенные документы Obrazec.Close Proverk.Close ' Переписываем результат из промежуточного файла проверки в итоговый PromRezult.Range.Copy 'Копируем из промежуточного все в буфер обмена PromRezult.Close False ' Закрыть промежуточный документ без сохранения (False) oSelectionPlace.Range.Paste ' Вставляем все из буфера обмена в итог Else ' Раз ошибка есть, то пишем о ней ученику в итоговый файл On Error Goto 0 ' Отключение обработчика ошибок см. http://www.cyberforum.ru/vba/thread735309.html oSelectionPlace.Font.Size = "16" ' Указываем размер шрифта oSelectionPlace.Font.Color = RGB(255, 00, 00) ' Устанавливаем цвет текста oSelectionPlace.TypeText "ОШИБКА! Файл не открывается! Скорее всего, файл был сохранен с неправильным расширением, или расширение было заменено вручную, а не при сохранении Word в окне Сохранить как... пункт: Тип файла." ' В файле проверке Сообщаем ученику об ошибке с самим файлом End If Else '[если файл не найден то выполнить эти команды:] oSelectionPlace.Font.Size = "16" ' Указываем размер шрифта oSelectionPlace.Font.Color = RGB(255, 00, 00) ' Устанавливаем цвет текста oSelectionPlace.TypeText "Файл отсутствует! Значит задание не выполнено или файл сохранен в другом месте или имя файла написано неправильно." ' В файле проверке Сообщаем ученику об ошибке с самим файлом End If ItogRezult.Save() 'Сохраняем результат проверки ItogRezult.Close ' Закрываем файл с результатом проверки n=n+1 ' Увеличиваем перменную проверки пар документов (т.е. переходим к следующей паре) NEXT Set ItogRezult = oDoc.Documents.Open(pathPro & ItogoviRezultat) ' Добавляем документ Для записи итоговых результатов Set oSelectionPlace = oDoc.Selection ' Получаем доступ к выделенной области oSelectionPlace.Paragraphs.First.Range.Delete 'Удаляем первую (пустую) страницу ItogRezult.Save() 'Сохраняем результат проверки ItogRezult.Close ' Закрываем файл с результатом проверки Set objFSO = Nothing 'Завершаем работу с доступом к файлам WScript.Quit 0 'Закрываем WScript (тоже для доступак к файлам) oDoc.Quit 0 ' закрываем Word |
Последний раз редактировалось kosmonavtom, 14-01-2019 в 00:25. Причина: Код будет выглядеть лушче Отправлено: 00:23, 14-01-2019 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата kosmonavtom:
Цитата kosmonavtom:
Цитата kosmonavtom:
Цитата kosmonavtom:
|
||||
Отправлено: 02:17, 14-01-2019 | #9 |
Новый участник Сообщения: 18
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Это потому, что Вы завершаете исполнение скрипта: до того, как закрываете открытый экземпляр Word'а:» Да! Спасибо!!! Поменял местами и работает. Очень странно правда, т.к. до этого без обработчика ошибок и так работало! Еще нужно было подставить ItogoviRezultat в строку 30 примерно: В итоге вот так записана рабочая версия на практике: ' Литература: Условие http://forum.oszone.net/post-2782627.html ' Сравнение нескольких пар документов запуск сравнения и сохранение результатов сравнений в один файл Dim WshShell 'Объявляем переменные Dim objFSO ' переменная для файлов Dim strSourceFile ' Переменная для проверки есть ли файл с ответами Dim ArrProverk ' Массив для имен файлов проверки Dim ArrObrazec ' Массив для имен файлов образцов ' Нужно вприсать изменения (имена файлов, папок) в эту область: ArrProverk = Array(_ "31_Правила_ввода.docx",_ "31_Стих.docx",_ "31_Рецензия на пословицы.docx",_ "31_Объявление.docx") ' Запиши имена файлов которые нужно сравнить ArrObrazec = Array(_ "ОТВЕТ 31_Правила_ввода.docx",_ "ОТВЕТ 31_Стих.docx",_ "ОТВЕТ 31_Рецензия на пословицы.docx",_ "ОТВЕТ 31_Объявление.docx") ' Запиши имена файлов образцов (в том-же порядке) pathObr = "D:\Параметры страницы Редактирование текста\" 'Запиши путь до файлов образцов ItogoviRezultat = "31 ПРОВЕРКА.docx" 'Запиши имя файла для результата проверки Set WshShell = WScript.CreateObject("WScript.Shell") 'Создаем объект для пути pathPro = WshShell.CurrentDirectory & "\" 'Определяем путь до скрипта и файлов проверки (там куда нужно записать этот скрипт и запускать) Set oDoc = CreateObject("Word.Application") ' Создаём объект с Word-ом oDoc.Visible = False ' делаем НЕвидимым Word Const wdStory = 6 ' Константа для добавления новой страницы Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект проверки наличия файла Set ItogRezult = oDoc.Documents.Add() ' Добавляем документ Для записи итоговых результатов ItogRezult.SaveAs(pathPro & ItogoviRezultat) 'Сохраняем Документ ItogRezult.Close 'закрываем Документ n=0 'Переменная для цикла (перебор элементов массива т.е. всех файлов) FOR Each Item in ArrObrazec 'Перебираем все элементы которые только есть в массиве Образцов strSourceFile = pathPro & ArrProverk(n) ' Записываем новый файл в переменную для проверки Set ItogRezult = oDoc.Documents.Open(pathPro & ItogoviRezultat) ' Добавляем документ Для записи итоговых результатов Set oSelectionPlace = oDoc.Selection ' Получаем доступ к выделенной области oSelectionPlace.EndKey wdStory ' Проверяем конец документа (Литература: https://stackoverrun.com/ru/q/8591117) oSelectionPlace.InsertBreak ' Добавляем новую страницу в конце документа oSelectionPlace.TypeText "Результат проверки файла: " & strSourceFile ' Вводим текст (заголовок) в начале новой страницы oSelectionPlace.Style = "Заголовок 1" oSelectionPlace.TypeParagraph() ' Добавляем новый абзац If objFSO.FileExists(strSourceFile) Then '[если файл существует то выполнить эти команды:] On Error Resume Next 'Запускаем обработчик ошибок Set Proverk = oDoc.Documents.Open(strSourceFile, , False, , , , , , , , , True) If Err.Number = 0 Then 'Если ошибки нет то On Error Goto 0 ' Отключение обработчика ошибок см. http://www.cyberforum.ru/vba/thread735309.html Set Obrazec = oDoc.Documents.Open(pathObr & ArrObrazec(n), , False, , , , , , , , , True) Set PromRezult = oDoc.CompareDocuments(Proverk, Obrazec, , False, , , , , , , , , True) 'Записываем промежуточный результат сравнения ' Закрываем проверенные документы Obrazec.Close Proverk.Close ' Переписываем результат из промежуточного файла проверки в итоговый PromRezult.Range.Copy 'Копируем из промежуточного все в буфер обмена PromRezult.Close False ' Закрыть промежуточный документ без сохранения (False) oSelectionPlace.Range.Paste ' Вставляем все из буфера обмена в итог Else ' Если ошибка есть, то пишем о ней ученику в итоговый файл On Error Goto 0 ' Отключение обработчика ошибок см. http://www.cyberforum.ru/vba/thread735309.html oSelectionPlace.Font.Size = "16" ' Указываем размер шрифта oSelectionPlace.Font.Color = RGB(255, 00, 00) ' Устанавливаем цвет текста oSelectionPlace.TypeText "ОШИБКА! Файл не открывается! Скорее всего, файл был сохранен с неправильным расширением, или расширение было заменено вручную, а не при сохранении Word в окне Сохранить как... пункт: Тип файла." ' В файле проверке Сообщаем ученику об ошибке с самим файлом End If Else '[если файл не найден то выполнить эти команды:] oSelectionPlace.Font.Size = "16" ' Указываем размер шрифта oSelectionPlace.Font.Color = RGB(255, 00, 00) ' Устанавливаем цвет текста oSelectionPlace.TypeText "Файл отсутствует! Значит задание не выполнено или файл сохранен в другом месте или имя файла написано неправильно." ' В файле проверке Сообщаем ученику об ошибке с самим файлом End If ItogRezult.Save() 'Сохраняем результат проверки ItogRezult.Close ' Закрываем файл с результатом проверки n=n+1 ' Увеличиваем перменную проверки пар документов (т.е. переходим к следующей паре) NEXT Set ItogRezult = oDoc.Documents.Open(pathPro & ItogoviRezultat) ' Добавляем документ Для записи итоговых результатов Set oSelectionPlace = oDoc.Selection ' Получаем доступ к выделенной области oSelectionPlace.Paragraphs.First.Range.Delete 'Удаляем первую (пустую) страницу ItogRezult.Save() 'Сохраняем результат проверки ItogRezult.Close ' Закрываем файл с результатом проверки Set objFSO = Nothing 'Завершаем работу с доступом к файлам oDoc.Quit 0 ' закрываем Word WScript.Quit 0 'Закрываем WScript (тоже для доступак к файлам) |
Последний раз редактировалось kosmonavtom, 14-01-2019 в 08:14. Причина: Добавил обновленный код программы. Отправлено: 07:38, 14-01-2019 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
FreeBSD - Открытия портов! | Ruslan19891989 | Общий по FreeBSD | 5 | 29-03-2012 15:53 | |
Службы - Ошибка открытия сокета | VooDoo91 | Microsoft Windows 7 | 9 | 22-04-2010 12:44 | |
Изменение положения открытия окна | 12341234 | Microsoft Windows 2000/XP | 9 | 28-01-2007 14:32 | |
скорость открытия приложений.... | ZVOd_ | Microsoft Windows 2000/XP | 6 | 02-08-2006 09:08 | |
ошибка открытия сокета | eggdrop | Microsoft Windows 2000/XP | 9 | 12-04-2005 20:18 |
|