вызывать .vbs из пакетного скрипта

В продолжение сценария, предоставленного rojo в экранируйте двойные кавычки в параметре файла в пакетный сценарий, после того как я проанализировал исходный файл данных, мне нужно вызвать сценарий .vbs из пакета. Сценарий .vbs должен быть снабжен двумя маркерами, сгенерированными путем синтаксического анализа исходного файла данных. Один из токенов — это URL-адрес файла на сервере, а другой — путь на локальном диске. Сценарий .vbs загружает указанный файл, указанный маркером один, по локальному пути, указанному маркером два. Что я хочу сделать, так это вызвать сценарий .vbs в приведенном выше сценарии и передать ему токены в качестве параметров. myvbscript.vbs /FileURL:"https://abc.com/a.pdf" /HDРасположение: "C:\a.pdf"

Вот файл .bat, который у меня есть.

    @if(@a==@b) @end
/* :: batch portion
@ECHO OFF
setlocal if exist "%~1"
 ( cscript /nologo /e:jscript "%~f0" < "%~1" )
 else ( cscript /nologo /e:jscript "%~f0" )
 exit /b 
:: JScript portion */ 
while (!WSH.StdIn.AtEndOfLine) {
 var line=WSH.StdIn.ReadLine();
 var st_token = line.split('\t');
 var FileUR="abc.com/a.pdf";
 var HDLocation="C:\a.pdf"; 
WSH.Echo(req_id); 
WSH.Echo(att_tokens[i]);
 <<INVOKE VBSCRIPT WITH PARAMETERS>> 

Мне нужно вызвать vbscript вместо <<INVOKE VBSCRIPT WITH PARAMETERS>> Пожалуйста, помогите}

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

Сценарий .vbs выглядит следующим образом:

'Set your settings

Set colNamedArguments = WScript.Arguments.Named

strFileURL = colNamedArguments.Item("FileURL")
strHDLocation = colNamedArguments.Item("HDLocation")

' Fetch the file

Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")

objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()

If objXMLHTTP.Status = 200 Then
  Set objADOStream = CreateObject("ADODB.Stream")
  objADOStream.Open
  objADOStream.Type = 1 'adTypeBinary

  objADOStream.Write objXMLHTTP.ResponseBody
  objADOStream.Position = 0    'Set the stream position to the start

  Set objFSO = Createobject("Scripting.FileSystemObject")
    If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocation
  Set objFSO = Nothing

  objADOStream.SaveToFile strHDLocation
  objADOStream.Close
  Set objADOStream = Nothing
End if

Set objXMLHTTP = Nothing

person user646108    schedule 22.04.2013    source источник
comment
У меня код работал нормально, хотя вы могли отказаться от start "" cmd /c и просто запустить cscript напрямую. Как именно он у вас не работает? Вы получаете сообщение об ошибке? Каково значение objXMLHTTP.Status?   -  person Ansgar Wiechers    schedule 22.04.2013
comment
Код, который я обновил ниже, должен дать вам то, что вам нужно.   -  person AxGryndr    schedule 23.04.2013


Ответы (1)


В вашем файле используйте:

Для .BAT, вызывающего .VBS

cscript //nologo [FILE.vbs] argsX argsY

Для .JS, вызывающего .VBS

 wsShell = WScript.CreateObject("WScript.Shell");
 wsShell.run ("[FILE.VBS] argsX argsY");

Вам нужно будет прочитать два параметра в вашем .vbs, и для этого вы можете использовать:

Set args = WScript.Arguments
argsX = args.Item(0)
argsY = args.Item(1)

Это есть в вашем коде, но я решил отметить, как это делается, для тех, кто ищет похожее решение.

Теперь вы можете использовать аргументы/параметры так же, как и переменные в своем коде.

Пример .BAT был протестирован с помощью testB.bat и содержал следующие строки кода.

@ECHO OFF
cscript //nologo testv.vbs Hey There

Пример .JS был протестирован с использованием test.js, и в нем были следующие строки кода.

wsShell = WScript.CreateObject("WScript.Shell");
wsShell.run ("testV.VBS Hey There");

Строки кода в testV.vbs следующие.

Set args = WScript.Arguments
firstArg = args.Item(0)
secondArg = args.Item(1)
MsgBox(firstArg)
MsgBox(secondArg)

Все файлы хранятся в одном каталоге. Двойной щелчок на файле test.js или testB.bat создает два окна сообщений. Первый говорит «Привет», а второй говорит «Там».

person AxGryndr    schedule 22.04.2013
comment
Привет, я вызвал код, который вы предоставили выше, в Jscript. Однако я получаю эту ошибку: Ошибка выполнения Microsoft JScript: «cscript» не определен. Мне нужно вызвать vbscript в части JScript, поскольку у меня есть токены в Jscript. - person user646108; 22.04.2013
comment
Запуск пакетных файлов (или доступ к чему-либо на локальном компьютере пользователя) обычно блокируется/запрещается браузерами. Это ОГРОМНЫЙ риск для безопасности. - person StingyJack; 22.04.2013
comment
Javascript\Jscript - это (в основном) языки сценариев на основе браузера. Сценарий pushd/start, указанный в вашем вопросе, предназначен для запуска из командной строки, а не в браузере. - person StingyJack; 22.04.2013
comment
@AxGryndr -1, потому что вы просто заменили именованные аргументы (которые являются лучшим выбором из пользовательского интерфейса PoV) безымянными аргументами. - person Ansgar Wiechers; 22.04.2013
comment
ОК, потому что вы указали пакетный файл, который является .BAT, а не .JS - JScript отличается от пакетного файла. Я считаю, что для решения проблемы, с которой вы столкнулись, вам нужно изменить cscript на wscript. - person AxGryndr; 22.04.2013
comment
@Ansgar Я использовал общие термины переменных, а не имена, чтобы кто-то мог понять, что означают части. Это создает код более общего использования, который следует изменить для конкретной цели. Я согласен с тем, что программист должен использовать определенные имена переменных, которые имеют смысл в своем коде, чтобы во время отладки он понимал, что происходит. - person AxGryndr; 22.04.2013
comment
@AxGryndr Не занимайтесь исправлением кода, который изначально не сломан. Его обработка аргументов работает просто отлично, и нет причин обобщать ее. - person Ansgar Wiechers; 22.04.2013
comment
@Ansgar, похоже, у тебя проблема. Я указал, что добавил это, чтобы тот, кто ищет решение с похожей проблемой, понял, что происходит. я не добавлял его, чтобы исправить его код. - person AxGryndr; 22.04.2013
comment
Пожалуйста, помогите мне, вот мой пакетный скрипт '@ if (@ a==@ b) @ end /* :: пакетная часть @ECHO OFF setlocal, если существует %~1 (cscript /nologio /e:jscript %~f0 ‹ %~ 1 ) else ( cscript /nlogo /e:jscript %~f0 ) exit /b :: часть JScript */ while (!WSH.StdIn.AtEndOfLine) { var line=WSH.StdIn.ReadLine(); var st_token = line.split('\t'); var FileUR=abc.com/a.pdf; var HDLocation=C:\a.pdf; WSH.Echo(req_id); WSH.Echo(att_tokens[i]); ‹‹INVOKE VBSCRIPT WITH PARAMETERS›› }' Мне нужно вызвать vbscript вместо ‹‹INVOKE VBSCRIPT WITH PARAMETERS›› Пожалуйста, помогите - person user646108; 22.04.2013
comment
@user646108 user646108 Пожалуйста, не публикуйте фрагменты кода в комментариях (если они не однострочные), потому что код может стать нечитаемым. Вместо этого обновите свой вопрос. - person Ansgar Wiechers; 22.04.2013
comment
Я обновил свой ответ, включив в него пример вызова из файла .BAT и вызова из файла .JS. Надеюсь это поможет. - person AxGryndr; 22.04.2013
comment
Это было проверено с помощью файла .VBS, вызываемого из файла .JS. Я включил свои строки кода из двух тестовых файлов, чтобы вы могли проверить это самостоятельно. - person AxGryndr; 23.04.2013
comment
Я только что добавил пример .BAT на случай, если он появится. - person AxGryndr; 23.04.2013
comment
Привет @AxGryndr, как мне загрузить файл с защищенного URL-адреса. Я имею в виду, если сервер запрашивает логин-пароль? Заранее спасибо. - person user646108; 29.04.2013