Запустить выполнение файла из буфера

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем Паразит, 22 сен 2016.

  1. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Привет. Я что-то не пойму, а что, в JScript и VBScript нет возможности работать с клипом?
    Существуют-ли методы, анолочичные таким?
    GetTextFromClip или getClipboardText

    Код (vb.net):

    clipString = getClipboardText()
    CreateObject("WScript.Shell").Run clipString
     
    Код (vb.net):

    On Error Resume Next
    Set WshShell = CreateObject("WScript.Shell")
    clipString = getClipboardText()
    WshShell.ShellExecute(clipString)
    Set wshShell = Nothing
     

    Как мне запустить файл на исполнение, путь до которого находится в клипе, не используя при этом никаких стороних библиотек или фреймворков? Меня интересуют исключительно JScript и VBScript.
     
  2. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    через объект "InternetExplorer.Application"
    --- Объединённое сообщение, 22 сен 2016 ---
    Например:
    Код (Text):
    Set obj = CreateObject("InternetExplorer.Application")
    obj.Navigate("about:blank")
    clip = obj.document.parentWindow.clipboardData.getData("text")
    obj.Quit
     
    соответственно в переменную помещается текст из буфера
     
    Dragokas нравится это.
  3. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Не работает. Я запускаю его из VBS-файла. Видно, что на мгновение фокус перемещается, но ничего не запускается.
    У меня ХР.
     
    Последнее редактирование: 22 сен 2016
  4. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    а ничего и не должно запускаться, это только копирование текста из буфера
     
  5. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    А у меня задача, запустить файл на исполнение, полный путь которого находится в клипе.
     
  6. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Код (Text):
    Set obj = CreateObject("InternetExplorer.Application")
    obj.Navigate("about:blank")
    clip = obj.document.parentWindow.clipboardData.getData("text")
    obj.Quit
    Set WshShell = CreateObject("WScript.Shell")
    RetCode = WshShell.Run(clip, 1, True)
    только стоит проверку сделать путь ли в буфере
     
    Dragokas и Паразит нравится это.
  7. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Да, сейчас заработало. Спасибо.
    Я так понял, что не существуют таких методов?
    Я смотрю, что через InternetExplorer слишком много движений происходит.
    Я это по скорости запуска замечаю, и это мне показывают мои файловые и реестровые мониторы.
    А возможно-ли без него, как-то?
     
  8. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    можно через объект "htmlfile"
    Код (Text):
    Set obj = CreateObject("htmlfile")
    clip = obj.document.parentWindow.clipboardData.getData("text")
    Set WshShell = CreateObject("WScript.Shell")
    RetCode = WshShell.Run(clip, 1, True)
     
    Dragokas нравится это.
  9. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Выдаёт ошибку, что не поддерживается свойство или метод obj.document.
     
  10. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    убери document
    Код (Text):
    Set obj = CreateObject("htmlfile")
    clip = obj.parentWindow.clipboardData.getData("text")
    Set WshShell = CreateObject("WScript.Shell")
    RetCode = WshShell.Run(clip, 1, True)
     
    Dragokas и Паразит нравится это.
  11. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Работает. Спасибо.
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    htmlfile тоже по опыту не во всех ОС срабатывает.
    Я обычно в таких ситуациях подстраховываюсь внешней программой, например, GetClip (из состава ConClip от Carl E. Peterson):

    Код (vb.net):
        'попытка получить буфер через ConClip
        AppPath = "."
        set oFSO       = CreateObject("Scripting.FileSystemObject")
        set oShell     = CreateObject("WScript.Shell")
        if not oFSO.FileExists(AppPath & "\GetClip.exe") then
            msgbox "Программа GetClip не найдена!" & vbcrlf & "Буфер обмена пуст!"
            WScript.Quit
        end if
        oShell.Run "cmd.exe /c """"" & AppPath & "\GetClip.exe"" /text > """ & AppPath & "\Clip.txt" & """""", 6, true
        if oFSO.FileExists(AppPath & "\Clip.txt") then
            set oTS = oFSO.OpenTextFile(AppPath & "\Clip.txt", 1, false)
            rData = oTS.ReadAll
            oTS.Close
        end if
        msgbox rData
     
     
  13. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Dragokas, чё-то CMD.exe не запускается. Файл Clip.txt создаётся, сообщение вылазиет, а командный интерпретатор не запускается
     
    Последнее редактирование: 22 сен 2016
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Если Clip.txt создаётся, значит CMD уже запустился, отработал и закрылся (константа 6 - означает, что это происходит в свёрнутом режиме).
    Вообщем, в идеале, пишите:

    On Error Resume Next

    дальше код от Джон Китс, дальше:

    On Error Goto 0

    Проверка, получен ли буфер обмена, если нет, запускаем код выше.
    --- Объединённое сообщение, 22 сен 2016 ---
    Ну и AppPath вместо точки лучше все-таки прописать полный путь к EXE-файлу, например, путь к папке со скриптом, если GetClip.exe будет размещён в ней.
     
    Последнее редактирование: 22 сен 2016
  15. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Не запускается. Я поставил полный путь вместо точки. И со слешем на конце, и без. Не запускается.
    Код (vb.net):
    On Error Resume Next
        AppPath = "C:\Temp"
        set oFSO       = CreateObject("Scripting.FileSystemObject")
        set oShell     = CreateObject("WScript.Shell")
        if not oFSO.FileExists(AppPath & "\GetClip.exe") then
            msgbox "Программа GetClip не найдена!" & vbcrlf & "Буфер обмена пуст!"
            WScript.Quit
        end if
        oShell.Run "cmd.exe /c """"" & AppPath & "\GetClip.exe"" /text > """ & AppPath & "\Clip.txt" & """""", 1, true
        if oFSO.FileExists(AppPath & "\Clip.txt") then
            set oTS = oFSO.OpenTextFile(AppPath & "\Clip.txt", 1, false)
            rData = oTS.ReadAll
            oTS.Close
        end if
    On Error Goto 0
        msgbox rData
     
  16. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    А Вы файл GetClip.exe положили в папку "c:\Temp" и в буфер скопировали какой-нибудь текст?

    Добавил еще одно условие, иначе была ошибка, если буфер обмена пуст:

    Код (vb.net):

        AppPath = "C:\Temp"
        set oFSO       = CreateObject("Scripting.FileSystemObject")
        set oShell     = CreateObject("WScript.Shell")
        if not oFSO.FileExists(AppPath & "\GetClip.exe") then
            msgbox "Программа GetClip не найдена!" & vbcrlf & "Буфер обмена пуст!"
            WScript.Quit
        end if
        oShell.Run "cmd.exe /c """"" & AppPath & "\GetClip.exe"" /text > """ & AppPath & "\Clip.txt" & """""", 1, true
        if oFSO.FileExists(AppPath & "\Clip.txt") then
            set oTS = oFSO.OpenTextFile(AppPath & "\Clip.txt", 1, false)
            if not (oTS.AtEndOfStream) then
                rData = oTS.ReadAll
            end if
            oTS.Close
        end if

        msgbox rData
    P.S.
    Моему коду по большому счёту On Error Resume Next не нужны, иначе не будет видно ошибок, если например повреждена какая-нибудь из системных библиотек.
     
  17. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Dragokas, не запускается. GetClip.exe находится в папке. В буфере полный путь до файла.
    Clip.txt тоже создаётся с полным путём до файла. Но чего-то не запускается.
    Похоже, что командному интерпретатору неправильно выданы аргументы
     
    Последнее редактирование: 22 сен 2016
  18. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Паразит, Вы как я понимаю, учитесь программировать, значит пора называть вещи своими именами.
    1. Не запускается, это когда файл скрипта вообще не запускается, и не выполняется ни единой строчки.
    В Вашем случае, на сколько я понял, просто выдаётся пустое сообщение, так? Значит так и нужно говорить, что не может считать данные из файла Clip.txt и как следствие выдаёт пустой msgbox.
    2. Коммандный интерпретатор - это cmd.exe. Его результирующая строка запуска выглядит так:
    Код (DOS):

    cmd.exe /c ""Путь\GetClip.exe" /text > "Путь\Clip.txt""
     
    Если бы параметры были переданы неправильно, то Clip.txt не создался бы и тем более не содержал бы текста с тем, что у Вас в буфере обмена. У Вас он создаётся, и содержит, значит всё задано правильно, и отработало правильно.
    Значит остаётся что-то неверное с процессом чтения с файла.

    Проверьте, что файл Clip.txt что либо содержит и затем выполните код:

    Код (vb.net):
    set oShell     = CreateObject("WScript.Shell")
    set oTS = oFSO.OpenTextFile("C:\Temp\Clip.txt", 1, false)
    rData = oTS.ReadAll
    msgbox rData
    Получили сообщение с содержимым файла?
     
  19. Паразит
    Оффлайн

    Паразит Новый пользователь

    Сообщения:
    33
    Симпатии:
    1
    Содержит. Код выполняю. Появляется окно с полным путём до файла.



    Вот я запускаю cmd в этой папке.
    Ввожу такую команду, и появляется строка с полным путём до файла

    Код (DOS):
    GetClip.exe /text Clip.txt
    Мне кажется, что он должен выполнить эту команду, а не вывести её на экран
     
    Последнее редактирование: 22 сен 2016
  20. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    А что должно происходить по Вашему?
    --- Объединённое сообщение, 22 сен 2016 ---
    Тогда не вижу разницы между общим кодом и тестовым. Всё должно работать, как и задумано.
    --- Объединённое сообщение, 22 сен 2016 ---
    Уточните, Вы запускаете код из этого поста, и появляется пустой msgbox, если буфер обмена содержит текст?
     

Поделиться этой страницей