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

时间:2014-05-13 14:10:01

标签: vbscript asp-classic

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

3 个答案:

答案 0 :(得分:13)

  

<强>更新

     

由于不清楚是否最好指出您的Object Required问题归因于此行

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

这是因为预期会有一个对象,但是您要为其分配一个字符串,方法是删除代码可以使用的Set(因为Ekkehard.Hornerpointed out)。

     
     

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


原始答案

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

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

  3. 以下是我重命名了一些变量的示例(例如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
    

    需要考虑的事项

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

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

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

答案 1 :(得分:0)

作为

>> 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”,一个答案甚至重复了暴行。所以我试着指出确实存在一个错误:虚假的Set。
  4. 我悲惨地失败了。证据:当在Wscript.Shell上调用Run时,John Saunders将标题从“VBScript错误”(非特定但真实)更改为“需要对象”(具体但错误),Lankymart从事心理学/语言学研究以保存Set at the费用的字符串。
  5. 我唯一的希望:每一个阅读此内容的人都会因为我对该套装的喋喋不休而感到厌恶,她/他从现在开始会在打字时三思而后行:
  6. WTF

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

答案 2 :(得分:-3)

我不确定,请尝试更改

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

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