【问题标题】:invoke .vbs from batch script从批处理脚本调用 .vbs
【发布时间】:2023-05-17 03:08:01
【问题描述】:

继续 rojo 在escape double quotes in param file to batch script 提供的脚本,在我解析了初始数据文件之后,我需要从批处理中调用一个 .vbs 脚本。 .vbs 脚本需要提供通过解析初始数据文件生成的 2 个令牌。其中一个令牌是服务器上文件的 URL,另一个是本地磁盘上的路径。 .vbs 脚本将令牌一指定的指定文件下载到令牌二指定的本地路径。 我想要做的是在上面的脚本中调用 .vbs 脚本并将令牌作为参数传递给它。 myvbscript.vbs /FileURL:"https://abc.com/a.pdf" /HDLocation:"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 来代替 &lt;&lt;INVOKE VBSCRIPT WITH PARAMETERS&gt;&gt; 请帮助}

请帮助我调用上面脚本中的 .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

【问题讨论】:

  • 代码对我来说工作得很好,虽然你可以放弃start "" cmd /c,直接运行cscript。它究竟对您“不起作用”如何?你有错误吗? objXMLHTTP.Status 的值是多少?
  • 我在下面更新的代码应该可以满足您的需求。

标签: vbscript batch-file jscript


【解决方案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 文件会创建两个消息框。第一个说“嘿”,第二个说“那里”。

【讨论】:

  • 嗨,我在 Jscript 中调用了您上面提供的代码。但是,我收到此错误:Microsoft JScript 运行时错误:'cscript' 未定义。我需要在 JScript 部分调用 vbscript,因为我在 Jscript 中有标记。
  • 运行批处理文件(或访问用户本地计算机上的任何内容)通常会被浏览器阻止/禁止。这是一个巨大的安全风险。
  • Javascript\Jscript 是基于浏览器的(主要是)脚本语言。您问题中列出的“pushd/start”脚本旨在从命令提示符而不是在浏览器中运行。
  • @AxGryndr -1 因为您只是用未命名的参数替换了命名参数(这是用户界面 PoV 的更好选择)。
  • @user646108 请不要在 cmets 中发布代码 sn-ps(除非它们是 1-liners),因为代码往往变得不可读。而是用它更新您的问题。