问题 在分配中使用Set时“需要对象”


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


3889
2018-05-13 14:10


起源

只需删除 set 它仅用于对象引用而不是基本的变量赋值 - Alex K.
由于现有的答案我决定回答这个,但通常我会问你有什么尝试?只是在这里发布“我的代码”和“它给我错误:”不适合这个网站,请尝试改善您的问题或我担心它可能最终被删除。 - Lankymart
顺便说一下,这是一个可怕的头衔。我只是编辑了你的头衔,我更喜欢我的。你怎么看呢? - John Saunders
@JohnSaunders更好:) - Lankymart


答案:


更新

因为不清楚是否最好指出你的 Object Required 问题是由于这条线

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

这是因为期望一个Object,但是你通过删除它来为它分配一个字符串 Set 你的代码将工作(作为 Ekkehard.Horner 具有 指出)。


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


原始答案

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

  2. .Run() 应该由实例化执行 scmd 对象并传递命令行来执行。

这是一个我重命名了一些变量的例子(scmd 至 cmd 例如)。

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

要考虑的事情

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

  1. 运行命令将使用当前的应用程序池标识执行。

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


12
2018-05-13 15:45



顶部灰色部分的+1。 (顺便说一句:请考虑删除您对Alex K.上述评论的错误/误导性评论) - Ekkehard.Horner


>> 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' 错误,这显然太多了。为了解释/原谅那些简易爆炸装置你必须考虑到BASIC是一种石器时代的语言。
  2. 学习VBScript的人有权对此感到惊讶 "Set x = 'non-object' 错了两次。如果它发生三次(或更频繁),他/她应该感到羞耻(并保持沉默)。最重要的是,这个问题不应该污染这个网站。
  3. 当我发布我的贡献时,所有答案/评论 - 除了Alex K.的'Just delete the Set' - 强调/集中在.Run语句上;一个答案称剧本为“topsy curvy”,一个答案甚至重复了暴行。所以我试着指出确切的  错误:虚假集。
  4. 我悲惨地失败了。证据:当在Wscript.Shell上调用Run时,John Saunders将标题从“VBScript错误”(非特定但真实)更改为“需要对象”(具体但错误),Lankymart从事心理学/语言学研究以保存Set at the费用的字符串。
  5. 我唯一的希望是:每一个读这篇文章的人都会因为我对该套装的喋喋不休而感到厌恶,从现在起她/他会在打字时三思而后行:

WTF

Set x = "     ---- stop or be damned!!!
Set x = obj.getNumber() + 4  ---- oh no!!!
  1. 一切都无济于事 - 同样的错误

0
2018-05-13 17:21



试着把它分解,这样他们就可以看到代码搞砸的地方是有益的。必须承认从未使用过 Server.CreateObject 这样(作为一个一个对象),但不要以为我会永远。关于我的观点 Set OP正在努力 Set 一个字符串,导致 Object Required。 - Lankymart
OP已经有了这个事实 Set 在那里向我建议,他们可能最初在那里实例化了对象,但是在某些时候修改代码时他们最终得到了topsy turvy。 - Lankymart
老实说,你回答这个问题的答案还是仅仅是对我答案的批评? - Lankymart
@Lankymart这就是Ekke如何滚动,看看这个宝石: stackoverflow.com/questions/23814335/... 要给他信任,他肯定喜欢听自己说话。 - Rich


我不确定,尝试改变

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

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

-3
2018-05-13 14:13



scmd 是一个字符串所以 Set 不需要。还有任何字符串逃逸 VBScript中 要么 ASP经典 要求 "" 或者字符串将引发语法错误。在这个例子中,字符串应该是 scmd = """c:\windows\system32\cscript.exe"" //nologo ""c:\s.vbs"""。但无论如何,这不是问题。 - Lankymart
-1:语法不正确;在非对象分配中使用Set是明显错误的。 - Ekkehard.Horner
-1感谢您的回答,但我们更喜欢 好, 正确 答案。如果你不确定,那就不要回答。 - John Saunders
好吧,我想帮忙,但是当我不确定时就回答。我会记住它,谢谢! - user3611729