我尝试了许多不同的脚本任务,包括 VB、C 和 SQL,但没有一项能够稳定地控制流程。有时它有效,而在其他情况下则无效。下面是我的变量列表——前三个变量是我原本想要使用的,但我添加了 FullPath 以简化事情。不幸的是,这并没有改变什么。
我的测试:我从目录中删除源文件并在 VS 中执行包,它会调用发送电子邮件任务来通知我文件不存在。然后我将文件放回原处并执行程序包,它再次调用发送电子邮件任务,好像文件不存在一样。我对断点和监视窗口不是很熟悉,所以我为 FilePath 和 FileExists 放置了两个消息框——FilePath 返回的值是正确的,带有文件名,但之后立即返回的 FileExists 消息框值为 0。请注意,在同时告诉我它看不到文件的这个时刻,我已经检查了磁盘,并可以看到它在那里。
这是重点:我已经在这上面花了好几天的时间,昨天在测试时,它突然就能用了!我将文件放入源目录中,它正确地运行了整个过程。我从源目录中删除文件,它调用了发送邮件任务并成功完成。我多次成功地测试了这两种情况,但现在又失败了。我不明白为什么,也没有时间和兴趣继续测试这个仅在间歇性工作的文件存在检查脚本任务。我甚至试图获取我听说过的 File Properties 任务(https://archive.codeplex.com/?p=filepropertiestask),但它与当前软件版本不兼容。我已经尝试了 VS 2019 和 SSDT 2017,无论哪个都不支持 File Properties。或者,我只是不知道如何安装它。
有人可以提供建议吗?
变量-
- FileName 字符串,fileName.txt - FilePath 字符串,C:\directory path\ - FileExists 布尔值,False(虽然我尝试了 int32、甚至 char N/Y) - FullPath 字符串,C:\Directory path\filename.txt
C 脚本任务尝试-
public void Main()
{
// TODO: Add your code here
String Filepath = Dts.Variables["User::FilePath"].Value.ToString() + Dts.Variables["User::FileName"].Value.ToString();
if (
File.Exists(Filepath))
{
Dts.Variables["User::FileExists"].Value = 1;
}
else
Dts.Variables["User::FileExists"].Value = 0;
Dts.TaskResult = (int)ScriptResults.Success;
}
或者
//TODO: Add your code here
String Filepath = Dts.Variables["User::FilePath"].Value.ToString() + Dts.Variables["User::FileName"].Value.ToString();
if (
FileExists(Filepath))
{
Dts.Variables["User::FileExists"].Value = 1;
}
MessageBox.Show(Filepath);
MessageBox.Show(Dts.Variables{"User::FileExists"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
}
甚至只需要这么简单:
Dts.Variables("FileExists").Value = File.Exists(Dts.Variables("FilePath").Value).ToString
Dts.TaskResult = (int)ScriptResults.Success;
VB脚本任务 -
Public Sub Main()
' Fill WriteVariable with value from ReadVariable
Dts.Variables("User::FileExists").Value = Dts.Variables("User::FullPath").Value
Dts.TaskResult = ScriptResults.Success
End Sub
执行 SQL 任务 -
DECLARE
@FilesExist BIT = 0,
@FolderPath VARCHAR(100) = 'C:\directory path\'
DECLARE @Files TABLE ([FileName] VARCHAR(100), Depth INT, [File] INT)
INSERT INTO @Files
EXEC master.sys.xp_dirtree @FolderPath,1,1;
IF EXISTS(
SELECT 1 FROM @Files
WHERE [FileName] = 'fileName.txt'
AND Depth = 1
AND [File] = 1
)
SET @FilesExist = 1
RETURN;
脚本任务优先约束:
- 评估操作:表达式和限制条件
- 值:成功
- 表达式:@[User::FileExists]==1
- 逻辑 AND
评估操作:表达式和限制条件
- 值:成功
- 表达式:@[User::FileExists]==0
- 逻辑 AND
这是我控制流程的截图,其中脚本任务文件存在性检查是流程中的第7个项目。文件名中没有日期,它总是“filename.txt”。该文件由流程中的第4个任务通过合并其他文件创建,我刚刚得知需要在此处添加类似的检查,但有多个文件,所以我需要在包中的第3个任务之前进行通配符检查。
![enter image description here](https://istack.dev59.com/rOegx.webp)