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

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Привет. Я что-то не пойму, а что, в 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.
 

лис.хвост

VIP
Разработчик
Сообщения
636
Реакции
674
Баллы
318
через объект "InternetExplorer.Application"
Например:
Код:
Set obj = CreateObject("InternetExplorer.Application")
obj.Navigate("about:blank")
clip = obj.document.parentWindow.clipboardData.getData("text")
obj.Quit
соответственно в переменную помещается текст из буфера
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Не работает. Я запускаю его из VBS-файла. Видно, что на мгновение фокус перемещается, но ничего не запускается.
У меня ХР.
 
Последнее редактирование:

лис.хвост

VIP
Разработчик
Сообщения
636
Реакции
674
Баллы
318
а ничего и не должно запускаться, это только копирование текста из буфера
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
А у меня задача, запустить файл на исполнение, полный путь которого находится в клипе.
 

лис.хвост

VIP
Разработчик
Сообщения
636
Реакции
674
Баллы
318
Код:
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)
только стоит проверку сделать путь ли в буфере
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Да, сейчас заработало. Спасибо.
Я так понял, что не существуют таких методов?
Я смотрю, что через InternetExplorer слишком много движений происходит.
Я это по скорости запуска замечаю, и это мне показывают мои файловые и реестровые мониторы.
А возможно-ли без него, как-то?
 

лис.хвост

VIP
Разработчик
Сообщения
636
Реакции
674
Баллы
318
можно через объект "htmlfile"
Код:
Set obj = CreateObject("htmlfile")
clip = obj.document.parentWindow.clipboardData.getData("text")
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run(clip, 1, True)
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Выдаёт ошибку, что не поддерживается свойство или метод obj.document.
 

лис.хвост

VIP
Разработчик
Сообщения
636
Реакции
674
Баллы
318
убери document
Код:
Set obj = CreateObject("htmlfile")
clip = obj.parentWindow.clipboardData.getData("text")
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run(clip, 1, True)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
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
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Dragokas, чё-то CMD.exe не запускается. Файл Clip.txt создаётся, сообщение вылазиет, а командный интерпретатор не запускается
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
Если Clip.txt создаётся, значит CMD уже запустился, отработал и закрылся (константа 6 - означает, что это происходит в свёрнутом режиме).
Вообщем, в идеале, пишите:

On Error Resume Next

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

On Error Goto 0

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

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Не запускается. Я поставил полный путь вместо точки. И со слешем на конце, и без. Не запускается.
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
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
А Вы файл 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 не нужны, иначе не будет видно ошибок, если например повреждена какая-нибудь из системных библиотек.
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Dragokas, не запускается. GetClip.exe находится в папке. В буфере полный путь до файла.
Clip.txt тоже создаётся с полным путём до файла. Но чего-то не запускается.
Похоже, что командному интерпретатору неправильно выданы аргументы
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
Паразит, Вы как я понимаю, учитесь программировать, значит пора называть вещи своими именами.
1. Не запускается, это когда файл скрипта вообще не запускается, и не выполняется ни единой строчки.
В Вашем случае, на сколько я понял, просто выдаётся пустое сообщение, так? Значит так и нужно говорить, что не может считать данные из файла Clip.txt и как следствие выдаёт пустой msgbox.
2. Коммандный интерпретатор - это cmd.exe. Его результирующая строка запуска выглядит так:
CMD/BATCH:
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
Получили сообщение с содержимым файла?
 

Паразит

Активный пользователь
Сообщения
63
Реакции
2
Баллы
48
Содержит. Код выполняю. Появляется окно с полным путём до файла.



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

CMD/BATCH:
GetClip.exe /text Clip.txt
Мне кажется, что он должен выполнить эту команду, а не вывести её на экран
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
А что должно происходить по Вашему?
Содержит. Код выполняю. Появляется окно с полным путём до файла.
Тогда не вижу разницы между общим кодом и тестовым. Всё должно работать, как и задумано.
Уточните, Вы запускаете код из этого поста, и появляется пустой msgbox, если буфер обмена содержит текст?
 
Сверху Снизу