VBScript将无法从MSI文件正确执行

VBScript将无法从MSI文件正确执行,vbscript,windows-installer,setup-project,Vbscript,Windows Installer,Setup Project,我写了一个VBScript,需要从MSI文件执行。当我自己在Windows中运行脚本时,脚本会正确执行,但是,当我从安装程序运行脚本时,会出现以下错误,如日志文件所示: Microsoft VBScript runtime error: object required: 'WScript', Line 3, Column 2 脚本如下: sub shell(cmd) Set objShell = WScript.CreateObject("WScript.Shell") ob

我写了一个VBScript,需要从MSI文件执行。当我自己在Windows中运行脚本时,脚本会正确执行,但是,当我从安装程序运行脚本时,会出现以下错误,如日志文件所示:

Microsoft VBScript runtime error: object required: 'WScript', Line 3, Column 2
脚本如下:

sub shell(cmd)
    Set objShell = WScript.CreateObject("WScript.Shell")

    objShell.Run("""" & cmd & """")
    Set objShell = Nothing
end sub

set objFSO = CreateObject("Scripting.FileSystemObject")

strcmd32 = "C:\Path\PathToExecutable.exe"
strcmd64 = "C:\Path\PathToExecutable64.exe"

if (objFSO.FileExists(strcmd32)) then
    shell(strcmd32)
else 
    shell(strcmd64)
end if

set objFSO = Nothing
如前所述,如果我在安装程序的上下文之外运行该脚本,它运行良好。安装项目类型是VS2010安装和部署包(这是客户端希望使用的,我不能使用其他任何东西)。有什么想法吗?

在“shell”子部分中,我从调用“CreateObject()”之前的第一行删除了WScript。修改后的行现在如下所示:

'Note the absent reference to WScript on the call to CreateObject()
Set objShell = CreateObject("WScript.Shell")

如果你有一个简单的项目,包括一些合并模块和应用程序的文件,你可以使用一个更好的工具。对于您需要的内容,您可以使用免费版本,即创建“简单”项目类型。添加合并模块和文件只需一分钟

现在最简单的部分是,如果您完全摆脱了自定义操作,要创建快捷方式,您可以转到“文件和文件夹”页面,使用上下文菜单选项或工具栏,您可以创建快捷方式,您可以将其配置为指向合并模块中的文件,甚至不指向程序包中的文件


通过这种方式,您可以创建一个更干净、更简单的安装程序包,并且不必担心自定义操作失败的可能性。

WScript对象在作为自定义操作运行的VBS文件中不受支持。如果您需要使用这种类型的对象,上述方法是唯一有效的方法。另一方面,VBS自定义操作不是我的第一个建议,但这完全取决于您创建安装程序包的可用时间。VBS自定义操作会带来很多风险,如防病毒阻止或vscript引擎故障等。Win32 DLL将是自定义操作的最佳选择。基本上,我有这个脚本,然后是另一个创建包含在合并模块内的快捷方式的脚本(安装和部署项目不提供链接到合并模块内文件的功能),以及一个卸载时删除所述快捷方式的脚本。我选择vbs路线是为了节省时间,因为我没有时间学习如何创建自定义动作DLL。这是一个很好的建议,但我的客户希望使用安装和部署项目,因为这是他的团队所熟悉的。如果我有我的选择,我可能会使用WiX,因为这是我熟悉的。