【问题标题】:Argument passing in vbs在 vbs 中传递参数
【发布时间】:2014-08-19 06:28:51
【问题描述】:

我有一个可执行文件 (wget.exe),我希望通过一个简单的 vbs 文件不可见地运行它 - 我对 vbs 几乎没有经验。 wget.exe 接收一个参数,一个在线文件的 url,然后它将下载到当前目录中的文本文件中,协议和所有。

我的问题在于通过隐形脚本传递参数。以下脚本完美运行:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.Run """path\to\wget.exe"" http://www.url.com/helloworld", 0 , false

但是,这将字符串文字用于 url 参数。当我尝试更改 vbs 以接受它自己的参数以传递给可执行文件时,它在运行时失败。修改后的脚本如下:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.Run """C:\Users\Alienware\Desktop\game\wget.exe""WScript.Arguments.Item(0)", 0 , false 

我已经连续玩了几个小时,但无济于事。这可能是我遗漏的一些非常简单的事情,所以我要求用全新的眼光来告诉我这里出了什么问题。

提前致谢。

【问题讨论】:

  • 程序名称和网址之间没有空格。该项目在引号内,因此您将 WScript.Arguments.Item(0) 作为实际 URL 传递(没有 item(0) 顶级域)。
  • 空间问题可能是有效的,但它不是唯一的问题,因为添加空间时它仍然不运行。我相信它必须在一组引号内,否则它不会包含在与“运行”方法的程序相关的参数列表中。我看过的所有访问参数的例子都包括 item(0)。
  • 这是一个编程命令,不能用引号引起来,也不能当作文本处理。
  • 谢谢你,这是有道理的。您会建议我将参数连接到字符串文字,然后使用适当的空格,我接受它吗?

标签: vbscript exe argument-passing


【解决方案1】:

程序名称和网址之间没有空格。该项目在引号内,因此您将 WScript.Arguments.Item(0) 作为实际 URL 传递(没有 item(0) 顶级域)。

网址必须 100% 正确。与浏览器不同,没有代码可以修复 url。

我的程序的目的是获取错误详细信息。

如何获得正确的 URL 是在浏览器中输入我的 url,导航,正确的 URL 通常在地址栏中。另一种方法是使用链接的属性等来获取 URL。

Microsoft.XMLHTTP 也映射到 Microsoft.XMLHTTP.1.0。 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP 映射到 Msxml2.XMLHTTP.3.0。稍后再试

使用 xmlhttp 试试这个方法。编辑网址等。如果它似乎工作注释掉 if / end if to dump info 即使看起来工作。它是 vbscript,但 vbscript 在 vb6 中工作。

 On Error Resume Next
 Set File = WScript.CreateObject("Microsoft.XMLHTTP")
 File.Open "GET", "http://www.microsoft.com/en-au/default.aspx", False
 'This is IE 8 headers
 File.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C; .NET4.0E; BCD2000; BCD2000)"
 File.Send
 If err.number <> 0 then 
    line =""
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error getting file" 
    Line  = Line &  vbcrlf & "==================" 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error " & err.number & "(0x" & hex(err.number) & ") " & err.description 
    Line  = Line &  vbcrlf & "Source " & err.source 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "HTTP Error " & File.Status & " " & File.StatusText
    Line  = Line &  vbcrlf &  File.getAllResponseHeaders
    wscript.echo Line
    Err.clear
    wscript.quit
 End If

On Error Goto 0

 Set BS = CreateObject("ADODB.Stream")
 BS.type = 1
 BS.open
 BS.Write File.ResponseBody
 BS.SaveToFile "c:\users\test.txt", 2

还要看看这些其他对象是否有效。

C:\Users>reg query hkcr /f xmlhttp

HKEY_CLASSES_ROOT\Microsoft.XMLHTTP
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.5.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.5.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0
End of search: 12 match(es) found.

还要注意在锁定发生之前调用任何特定 XMLHTTP 对象的次数是有限制的。如果发生这种情况,并且在调试代码时确实如此,只需更改为不同的 xmlhttp 对象

【讨论】:

  • 我知道 wget.exe 程序运行完美。我唯一的问题是隐形脚本本身,它拒绝识别参数。我将尝试将参数连接到字符串并回复您。更新:串联有效,谢谢。
猜你喜欢
  • 2022-10-21
  • 1970-01-01
  • 2012-12-02
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2012-07-01
相关资源
最近更新 更多