【问题标题】:"Object required" when using Set in an assignment在作业中使用 Set 时“需要对象”
【发布时间】:2014-05-14 14:33:09
【问题描述】:
call main()
sub main()
    Dim scmd
    Set scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    createobject("wscript.shell").run scmd,0,false
end sub

它给了我错误:

Object required: '[string: "c:\windows\system32\"]' Code 800A01A8

【问题讨论】:

  • 只需删除 set 它仅适用于对象引用而非基本变量分配

标签: vbscript asp-classic


【解决方案1】:

更新

由于不清楚,最好指出您的Object Required 问题是由于这一行

Set scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"

这是因为需要一个对象,但您为其分配了一个字符串,通过删除Set,您的代码将起作用(因为Ekkehard.Horner 具有pointed out)。


以下是我对情况的解释。首先查看您的代码,它几乎看起来像是将WScript.Shell 对象的实例化与.Run() 方法的命令行混合在一起。这是我第一次尝试分解代码,重新排列然后将其重新组合在一起。


原答案

  1. 您的 Set scmd 应该实例化 WScript.Shell(正如 Ekkehard.Horner 指出的那样,您可以使用 Server.CreateObject("WScript.Shell").Run 作为一次性参考,但我不推荐它)。

    李>
  2. .Run()应该由实例化的scmd对象执行,并通过命令行执行。

这是一个我已将一些变量重命名的示例(例如,scmdcmd)。

Call main()

Sub main()
    'Renamed variables to cmd is your object and cmdline is your file path.
    Dim cmd, cmdline
    'Instantiate WshShell object
    Set cmd = Server.Createobject("WScript.Shell")
    'Set cmdline variable to file path
    cmdline = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    'Execute Run and return immediately
    Call cmd.Run(cmdline, 0, False)
End Sub

需要考虑的事项

在经典 ASP 中使用 WScript.Shell 运行可执行文件时,需要考虑一些事项;

  1. 运行命令将使用当前应用程序池身份执行。

  2. Run 将在服务器而不是客户端(服务器端)上执行可执行文件。

【讨论】:

  • +1 表示顶部的灰色部分。 (顺便说一句:请考虑删除您对上述 Alex K. 评论的错误/误导性评论)
【解决方案2】:

作为

>> WScript.Echo CreateObject("WScript.Shell").CurrentDirectory
>>
E:\trials\SoTrials\answers\trials\AlgoTaBu\SuSo\wsf

证明,“您的Set scmd 应该实例化 WScript.Shell”根本没有规则或法律。将要执行的命令放在字符串变量 scmd(或者更好的 sCmd)中,而不是为只使用一次的值创建变量是很好的做法。

修改后的版本(减去愚蠢的Set):

call main()
sub main()
    Dim scmd
    scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    createobject("wscript.shell").run scmd,0,false
end sub

与 Lankymart 的版本一样好用。

把所有内容都拼出来:

  1. Set 关键字、它的语义和它的错误消息是设计缺陷,使 VBScript 更难正确使用。 "site:stackoverflow.com vbscript "object required" Set" 产生 1500 次点击。即使这些点击中的大部分与"Set x = 'non-object' 错误无关,这显然也太过分了。要解释/原谅这些 IED,您必须考虑到 BASIC 是一种石器时代的语言。
  2. 学习VBScript 的人有权对"Set x = 'non-object' 错误两次感到惊讶。如果它发生三次(或更频繁),他/她应该感到羞耻(并保持沉默)。最重要的是,这个问题不应该污染这个网站。
  3. 当我发布我的贡献时,所有答案/cmets - 除了 Alex K. 的“Just delete the Set” - 强调/集中在 .Run 语句上;一个答案将脚本称为“topsy curvy”,一个答案甚至重复了暴行。所以我试图指出确实存在一个错误:The spurious Set。
  4. 我失败得很惨。证据:John Saunders 在调用 Run on Wscript.Shell 时将标题从“VBScript 错误”(不具体但真实)更改为“需要对象”(具体但错误),Lankymart 从事心理/语言学研究以将 Set 保存在字符串的费用。
  5. 我唯一的希望:阅读本文的每个人都会对我在 Set 上的竖琴感到厌恶,以至于她/他从现在开始在打字时会三思而后行:

wtf

Set x = "     ---- stop or be damned!!!
Set x = obj.getNumber() + 4  ---- oh no!!!
  1. 一切都无济于事 - Same mistake again

【讨论】:

  • 想想把它分解,这样他们就可以看到代码出错的地方是有益的。必须承认从未以这种方式使用过Server.CreateObject(作为一次性对象),但我认为我永远不会。我关于Set 的观点是OP 试图Set 导致Object Required 的字符串。
  • OP 已经有一个Set 的事实向我表明,他们可能最初在那里实例化了对象,但在修改代码时,他们最终弄得一团糟。
  • 老实说,您的回答是在回答问题,还是只是对我回答的批评?
  • @Lankymart 这就是 Ekke 的表现,看看这个宝石:stackoverflow.com/questions/23814335/… 一定要给他点赞,他肯定喜欢听自己说话。
【解决方案3】:

我不确定,请尝试更改

Set scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"

Set scmd = "c:\windows\system32\cscript.exe" //nologo "c:\s.vbs"

【讨论】:

  • scmd 是一个字符串,因此不需要 Set。在vbscriptasp-classic 中转义的任何字符串也需要"",否则该字符串将引发语法错误。在这个例子中,字符串应该是scmd = """c:\windows\system32\cscript.exe"" //nologo ""c:\s.vbs"""。但这无论如何都不是问题。
  • -1:甚至在语法上都不正确;在非对象赋值中使用 Set 是明显错误的。
  • -1 感谢您的回答,但我们更喜欢正确的答案。如果不确定,请不要回答。
  • 好的,我想帮忙,但不确定时不回答。我会记住的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 2011-08-29
  • 2022-07-27
  • 2020-05-16
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多