2

嗨,如果我将它放在 .vbs 文件中并运行它,我有以下 VBS 运行没有任何问题。

Dim objshell
Set objshell = CreateObject("Shell.Application")
objshell.NameSpace("C:\Temp").CopyHere(objshell.NameSpace("C:\Temp\Test.zip").Items())
Set objshell = Nothing

但是,如果我将其剪切并粘贴到 SSBI 2008 中的脚本任务中,它会运行并出现错误

Error: 0x1 at Script Task: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x80020003): Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
   at Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateSet(Object o, Type& objType, String name, Object[] args, String[] paramnames, Boolean OptimisticSet, CallType UseCallType)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase, CallType CallType)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSetComplex(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase)
   at ST_a4312d30d99b4cc4b02a2198afbc77d9.vbproj.ScriptMain.Main()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
Task failed: Script Task

我相信必须在 SSBI 内部进行一些配置,而不是默认运行才能使其正常工作。我是否必须改用 C# 也没关系。但只是不要让我使用和安装任何 3rd 方的东西。系统正在运行安装了 .NET 4.5 的 Windows 7。

请帮忙!谢谢!

4

2 回答 2

3

我弄清楚了配置,但它有点复杂。

  1. 打开您的脚本任务,编辑脚本。当脚本编辑窗口打开时,将上面的脚本放置到 Sub Main 并稍作改动:

    暗淡的 objshell

    变成

    将 objshell 调暗为 Shell

  2. 转到项目-> st_xxxxx 属性,签名,勾选签署程序集,选择新建,输入任何文件名,取消勾选使用密码保护我的文件。

  3. 转到引用,添加,COM,选择 Microsoft Shell 控件和自动化,确定。

    ** 你应该会看到一个弹出窗口说没有找到模板信息...,忽略它。**

  4. 突出显示您刚刚添加的 Microsoft Shell 控件并查看右下角的属性部分,确保“强名称”为 True。

    (如果您还没有完成第 2 步,这应该是 False,重做第 2 步并确保这是 True)

  5. 打开我的电脑,进入生成的Microsoft Shell Controls dll的路径(见突出显示的路径,通常是C:\Users\xxxxxxx\AppData\Local\Temp\SSIS\yyyyyyyyyyyyyyyyy\obj\Debug\Interop.Shell32.dll )。将其复制到其他地方(这是因为每次编辑脚本时都会随机生成原始路径 yyyyyyyyyyyyy,导致签名的 dll 每次都消失)。

  6. 返回 Project->st_xxxxx 属性,删除突出显示的 Microsoft Shell 控件。点击添加,浏览,选择刚才复制的Interop.Shell32.dll,OK。再次确保强名称属性为 True。如果没有,请从步骤 2 重做。

  7. 仍然在 References 中的 Imported namespaces 下,向下滚动以勾选 Shell32 旁边的框。

  8. 转到签名,取消勾选签署程序集。转到右上角的项目资源管理器,删除您在步骤 2 中创建的密钥文件 (xxxx.snk)(删除项目资源管理器中的密钥文件,而不是从您的文件夹中,确保它不再包含在您的项目资源管理器或您的脚本中任务不会运行)。

  9. 全部保存并关闭脚本编辑窗口。

  10. 在您的计算机中找到“gacutil.exe”。您应该将它与 SSIS 的安装一起安装。它位于 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\x64 下。键入 gacutil -i“步骤 5 中复制的 Interop.Shell32.dll 的路径”。

    例如 gacutil -i F:\Code\Interop.Shell32.dll

在所有这些步骤之后,您的脚本任务应该可以正常运行。当然,如果您使用其他 COM 引用,则需要这些步骤。让我知道是否有一些更简单的方法来完成这项工作。希望这可以帮助。

于 2012-10-23T08:13:51.467 回答
2

SSIS 中的脚本任务运行 .NET 代码,而不是 VBScript 代码。File只需使用Class和您需要的任何其他类在 VB.NET 中重新编写代码。

或者,保留您的 VBS 脚本并使用执行进程任务运行它。

于 2012-10-22T20:17:16.817 回答