【发布时间】:2022-08-02 23:21:05
【问题描述】:
我有一个 SSIS 包,它使用执行进程任务来运行 .bat 脚本。出于本示例的目的,我制作了一个非常简单的脚本,但它会失败。当我在命令提示符(黑色 DOS 窗口)中运行它时,它按预期失败,并向我显示详细的错误消息,说明它失败的原因。但是,当这个脚本在包内运行时,我得到的唯一错误消息是进程退出代码为“1”,而预期为“0”。我没有收到与在命令提示符中失败时相同的详细错误消息。
我正在使用的示例 .bat 脚本中就包含了这个。mkdir C:\\测试
因此,如果 C:\\test 文件夹已经存在,它将失败。我真正的脚本是在命令提示符中运行良好但在 SSIS 中失败的其他脚本,这就是为什么我试图查看详细的错误消息的原因。
所以,这就是背景,有人告诉我,捕获详细错误的方法是使用 Execute Process 任务中的 StandardErrorVariable 选项,如下所示。
首先,这是控制流的样子。
如您所见,我有一个名为“Run Bat File”的执行过程任务。它的配置如下。 C:\\temp\\Test.bat 是会失败的 bat 文件。我在 StandardErrorVariable 选项中添加了一个名为 \"Error\" 的变量。
接下来,我添加了一个脚本任务,并为 ReadOnlyVaribles 添加了变量“Error”。
最后,对于脚本,我添加了以下内容。我对这部分了解不多。我基本上是在关注别人给我看的东西。除了我圈出的内容之外,其他所有内容都只是 SSIS 在您打开新脚本窗口时为您提供的模板。
当我将它部署到 SSIS 目录并按预期运行时,包失败,但我没有得到想要的结果。我还是很模糊进程退出代码为“1”,而预期为“0”来自执行流程任务的错误。
另外,我收到来自脚本任务的错误,它说,在集合中找不到该元素。当您在执行包期间尝试从容器上的集合中检索元素并且该元素不存在时,会发生此错误。
我在脚本任务中做错了什么?
编辑#1:我正在添加变量窗口的屏幕截图,以响应脚本任务上的错误可能与变量范围有关的评论。
这是变量窗口的样子。
当我单击带圆圈的图标(称为移动变量)时,我看到了这一点。我认为这意味着变量的范围是包级别(?)
编辑#2:修复了愚蠢的拼写错误,现在程序包运行了,我看到了正在记录的测试 .bat 文件中的错误。但是当我用我需要运行的真实脚本运行这个包时,我得到了以下日志信息。
运行 Bat File:Error: In Executing \"c:\\program files (x86)\\WinSCP\\winscp.com\" \"/script=\\dcmfs01\\Datafile05\\BBG_DataLicense\\BBG_Instruments\\script\ \Delete.txt /parameter BBG_BVOL_DAILY.dat.20220724xx\" at \"\",进程退出代码为 \"1\",而预期为 \"0\"。 脚本任务:错误:
请注意,脚本任务确实被触发了,但看起来 \"error\" 变量没有看到任何错误消息。我推断这是因为在上面的 \"Script Task:Error:\" 部分之后没有任何内容。
所以凭直觉,我将 Execute Process 任务更改为如下所示。我将错误变量移至 StandardOutputVariable。
当我使用此更改运行包时,我看到记录了预期的错误,现在显示...
运行 Bat File:Error: In Executing \"c:\\program files (x86)\\WinSCP\\winscp.com\" \"/script=\\dcmfs01\\Datafile05\\BBG_DataLicense\\BBG_Instruments\\script\ \Delete.txt /parameter BBG_BVOL_DAILY.dat.20220724xx\" at \"\",进程退出代码为 \"1\",而预期为 \"0\"。 脚本任务:错误:正在搜索主机... 正在连接主机... 正在认证... 使用用户名“xxxxxxxxx”。 使用预先输入的密码进行身份验证。 已认证。 开始会话... 会话开始。 活动会话:1xxxxxx@sftp.xxxxxxxx.com / 无法获取文件 \'BBG_BVOL_DAILY.dat.20220724xx\' 的属性。 没有这样的文件或目录。 错误代码:2 来自服务器的错误消息:没有这样的文件
所以...底线,我得到它来显示错误消息,但显然这是来自标准输出。
** 2 个由此而来的问题。
- 如果执行流程任务失败,为什么它来自标准输出?
- 如果消息来自标准错误的另一种故障类型怎么办?我是否需要使用分配给 StandardErrorVariable 的另一个变量来配置另一个脚本任务来捕获该场景?**
-
错误消息“找不到元素...”表示脚本任务找不到变量。您能否确认该变量在范围内。在这种情况下,请确保它的范围仅限于包级别,而不是仅限于执行流程任务。请抓取变量窗口的屏幕截图。
-
马克,感谢您再次参与此活动。不确定如何在此评论中添加图片,因此我将编辑上面的帖子以包含变量窗口屏幕截图。
-
我刚刚注意到该变量在脚本中被错误地引用 - 删除 \"s.\" 它应该是
Dts.Variables[\"User::Error\"].Value.ToString() -
不用担心,我希望他们能够像在脚本组件中那样使变量可引用,但很高兴您现在了解如何访问这些东西。我会添加一个完整的答案
-
@MarkWojciechowicz Mark,我知道我们将此标记为已回答,但我可以重新参与吗?这适用于我正在使用的测试 bat 文件。但是当我使用真实的bat文件时,并没有得到预期的结果。一旦我再次引起您的注意,我将解释细节。