1

Тема: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Захотел  внутренности одного из элементов окна HTA сохранить в виде html-документа. Для этого создаю объект IE, пишу в него содержимое и вызываю метод объекта IE - диалог сохранения файла с подтверждением имени.
Смотрел на - Метод ExecWB


В созданном окне красиво видно переданное содержимое, но с записью файла заморочка:

1) если не указывать в "title" документа расширений файла, то предлагается по умолчанию тип файла
"Webarchive, single file (mht)" и по кнопке Save процесс сохранения какбы мелькает и без ошибок, но фактически файл так и не сохраняется;

2) если добавить в "title" расширение ".html", то предлагается уже "Webpage, complete (htm/html)", но документ сохраняется только с HEAD-ом - между тегами BODY - пусто;

3) если вручную выбрать тип "Webpage, HTML only (html)" - все чудесно сохраняется. А менять тип файла вручную совсем не хочется


Пришлось сохранить подготовленное для вывода в IE-документ содержимое в свой текстовый html-файл и запустить его через Run объекта "WScript.Shell". Но предварительное создание своего файла как-то не очень интересно.

Хотелось бы разобраться с таким поведением метода ExecWB...


'--- Открытие пустого документа в IE, перенос в него содержимого (параметр), запуск команды в IE "Save As..."'
Sub ue_btSaveLog_qqqq (param_innerHTML)
    ' формируем заголовок окна'
    Dim sTitle
    sTitle = "test_test_test"

    Dim objIE
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate "about:blank"
    While objIE.Busy
            Wscript.Sleep 200
    Wend
    
    ' начинаем формировать строку для записи в документ'
    sTitle = sTitle & ".html"
    Dim sOut
    sOut = "<HTML><HEAD>" &vbCrLf& "<TITLE>" & sTitle & "</TITLE>" &vbCrLf
    sOut = sOut &  "<meta http-equiv=content-type content=""text/html; charset=windows-1251"">"  &vbCrLf

    ' добавляем стили'
    sOut = sOut & _
        "<STYLE>" & _
        "*{font-family:Verdana;font-size:10;}" & _
        "</STYLE>" & _
                "</HEAD>" &vbCrLf
                
    ' добавляем "тело" - содержимое протокола'
    sOut = sOut & "<BODY>" & param_innerHTML & "</BODY></HTML>"
    
    objIE.Document.Write sOut
    objIE.Visible = 1
    Wscript.Sleep 500
    objIE.ExecWB 4,1,0,0 'Save as...'
End SUB

Скрипт предоставлен не в полном объеме, а только чуть подчищенная функция работы с IE.

WBR. Roman

2

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Спецы , ну помогите же ....

3

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Попробуй перед

objIE.Document.Write sOut

поставить

objIE.Document.Open "text/html", "replace"

а после

objIE.Document.Close

4

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Попробовал добавить указанные строки - ничего не изменилось, т.е. файл также сохраняется с пустым BODY.


'--- Открытие пустого документа в IE, перенос в него содержимого (параметр), запуск команды в IE "Save As..."'
Sub ue_btSaveLog_qqqq (param_innerHTML)
    ' формируем заголовок окна'
    Dim sTitle
    sTitle = "test_test_test"

    Dim objIE
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate "about:blank"
    While objIE.Busy
            Wscript.Sleep 200
    Wend
    
    ' начинаем формировать строку для записи в документ'
    sTitle = sTitle & ".html"
    Dim sOut
    sOut = "<HTML><HEAD>" &vbCrLf& "<TITLE>" & sTitle & "</TITLE>" &vbCrLf
    sOut = sOut &  "<meta http-equiv=content-type content=""text/html; charset=windows-1251"">"  &vbCrLf

    ' добавляем стили'
    sOut = sOut & _
        "<STYLE>" & _
        "*{font-family:Verdana;font-size:10;}" & _
        "</STYLE>" & _
                "</HEAD>" &vbCrLf
                
    ' добавляем "тело" - содержимое протокола'
    sOut = sOut & "<BODY>" & param_innerHTML & "</BODY></HTML>"
    
    objIE.Document.Open "text/html", "replace" '''' +
    objIE.Document.Write sOut
    objIE.Document.Close '''''' +
    objIE.Visible = 1
    Wscript.Sleep 500
    objIE.ExecWB 4,1,0,0 'Save as...'
End SUB

' тест открытия IE, заполнения контентом и вызова метода записи в файл'
ue_btSaveLog_qqqq ("kukuku<hr>tututut<br>12:39 19.11.2013")
WBR. Roman

5 (изменено: andreyua, 2013-11-19 19:44:40)

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Ну тогда скажите, как получить HTML (все HTML вместе с CSS) в переменную.
Это не канает :

Document.body.innerHTML
document.getElementsByTagName("body")[0].innerHTML

Упс , сорри, это канает :


document.getElementsByTagName("html")[0].innerHTML

6 (изменено: Евген, 2013-11-21 07:53:32)

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Вот кстати может в эту тему забуриться...
Т.е. скачать в файл, ну а потом уж считать что надо...
Кстати, "чёрные пояса" тут на форуме ещё использовали какой-то инопланетный объект [htmlfile] (если не ошибаюсь), может быть тоже Вам чем-то поможет распарсить нужный Вам элемент...

Времени не хватает... :-(

7

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Не уверен, что это то что нужно, но решил попробовать свои силы. Крайне не люблю использовать InternetExplorer.Application поэтому поюзал всё тот же старый контрол Shell.Explorer для сохранения.


<html>
    <head>
        <meta charset="windows-1251">
        <!-- 
        applicationName     идентификатор исполнения HTA-документа    /*name*/
        border              вид обрамления окна    thin, dialog, none, thick
        borderStyle         стиль обрамления окна    complex, normal, raised, static, sunken
        caption             наличие заголовка окна    yes/no
        icon                иконка заголовка, в формате ICO (32x32)    /*path*/
        maximizeButton      наличие кнопки «восстановить»    yes/no
        minimizeButton      наличие кнопки «свернуть»    yes/no
        showInTaskbar       отображение документа в панели задач Windows    yes/no
        windowState         исходный размер окна    normal, minimize, и maximize
        innerBorder         внутренняя граница окна    yes/no
        navigable           определяет открытие ссылки в новом окне или родительском    yes/no
        scroll              наличие полосы прокрутки    yes/no
        scrollFlat          3D-вид полосы прокрутки    yes/no
        singleInstance      возможность одновременного открытия нескольких окон    yes/no
        sysMenu             наличие системного меню и кнопок управления окном в заголовке окна    yes/no
        contextMenu         контекстное меню, вызываемое правой кнопкой мыши    yes/no
        selection           разрешение выделения текста в HTA-окне    yes/no
        version             версия HTA    /*version*/
        -->
        <hta:application
            id="Application"
            applicationName="SMEV files monitor"
            border="thick" 
            borderStyle="normal"
            caption="yes"
            icon=""
            maximizeButton="yes"
            minimizeButton="yes"
            showInTaskbar="yes"
            windowState="normal"
            innerBorder="no"
            navigable="yes"
            scroll="no"
            scrollFlat="no"
            singleInstance="yes"
            sysMenu="yes"
            contextMenu="no"
            selection="yes"
            version="1.0"
        >
        <title>Тестовый пример</title>
        <style>
        *{
            font-family:Tahoma;
            font-size:12px;
        }
        </style>
        <script language="vbscript">
        'Формуем окошко под небольшой размер
        window.resizeTo 400, 300
        </script>
    </head>
    <body bgcolor="#eeeeee">
        Тестовый пример<br><br>
        <button id="btnSave">Сохранить</button>
    </body>
    <script language="vbscript">
    Option Explicit
    Sub btnSave_onclick()
        'Константы для метода ExecWB
        Const OLECMDID_SAVEAS = 4
        Const OLECMDEXECOPT_PROMPTUSER = 1
        'Создаём User форму и используем её как подложку под объект Shell.Explorer. 
        'При этом снимаются ограничения на доступ к методам и свойствам.
        Dim UserForm
        Set UserForm = document.createElement("object")
        UserForm.classid = "clsid:C62A69F0-16DC-11CE-9E98-00AA00574A4F"
        document.appendChild UserForm
        'Добавляем на форму WebBrowser
        With UserForm.Controls.Add("Shell.Explorer","WebBrowser").Object
            'Навигатимся на пустую страницу, чтобы у Shell.Explorer-а заполнилось свойство Document
            .Navigate "about:blank"
            'Ждём окончания загрузки
            Do While .Busy: Loop
            .document.open "text/html"
            .document.write document.documentElement.outerHTML
            .document.close
            .ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER
            document.removeChild UserForm
        End With
    End Sub
    </script>
</html>
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Xameleon, спасибо! Работает. То, что надо:)

У меня сохраненный файл примера сначала при открытии в браузере был в крякозяблах (вернее - в "ромбиках"), но сменил кодировку HTA на UTF-8 - всё стало красиво.

WBR. Roman

9

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Rom5, рад что помогло. А на конечный вариант посмотреть можно, если не секрет ? Интересно, что получилось.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

10

Re: HTA/VBS: запуск в IE диалога "Save As..." - выходной файл без BODY

Xameleon, а поторопился я с выводом, оказывается.

Вернее - Ваш пример в теле HTA  отрабатывает отлично, но функционал этот я хотел задействовать в своём vbs, который создает пару html-окон - для интерфейса и протокола работы (было просто интересно применить эту техгологию, хотя по хорошему - логичнее все организовать в одном HTA) - так вот, из-под vbs подправленный под моё окно скрипт из примера работает без ошибок, но после нажатия в диалоге сохранения файла на "Save" история повторяется похожим образом - mht, который по умолчанию, просто не создается без каких либо сообщений.

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

WBR. Roman