如何配置SSIS包将备份文件直接移动到目标子文件夹?
这个问题我碰到过好几次啦!核心问题是你当前的配置没有动态保留源文件的子目录结构,导致文件直接丢到了目标根目录。咱们一步步调整就能解决:
第一步:调整Foreach循环容器的枚举器配置
确保你的Foreach File枚举器能正确捕捉到文件的相对路径:
- 打开Foreach循环编辑器,在集合标签页:
- 选择
Foreach File枚举器,设置根目录为C:\Backup - 勾选遍历子文件夹,这样能找到A文件夹里的备份文件
- 在文件栏输入
*.bak,过滤只处理备份文件
- 选择
第二步:新增变量并完善变量映射
你需要多几个变量来存储路径信息,让目标路径能动态拼接:
- 在变量窗口新增以下变量(作用域选整个包):
SourceRoot:字符串类型,值设为C:\Backup\DestinationRoot:字符串类型,值设为E:\DB Backups\SourceRelativePath:字符串类型,用来存储文件相对于SourceRoot的路径(比如A\xxx.bak)- 保留你原有的
sourcefileV(存储源文件完整路径)
- 回到Foreach循环的变量映射标签页:
- 把
sourcefileV映射到索引0(完整文件路径) - 把
SourceRelativePath映射到索引2(相对路径,相对于你设置的根目录C:\Backup)
- 把
第三步:动态生成目标文件路径
让destinationV自动拼接出带子文件夹的完整路径:
- 选中
destinationV变量,在属性窗口找到表达式,点击后面的省略号打开表达式编辑器 - 输入表达式:
@[User::DestinationRoot] + @[User::SourceRelativePath] - 点击「计算表达式」验证,应该能得到类似
E:\DB Backups\A\xxx.bak的结果,没问题就确认保存
第四步:修正文件系统任务的配置
这一步是关键,很多人在这里选错选项导致失败:
- 打开文件系统任务编辑器:
- 操作选择
移动文件 - 源连接:选择「变量」,然后选中
sourcefileV,确保IsSourcePathVariable设为True - 目标连接:同样选择「变量」,选中
destinationV——重点:一定要把IsDestinationPathVariable设为True,绝对不要选「文件夹」模式,否则文件会被直接移到目标根目录!
- 操作选择
可选:自动创建不存在的子文件夹
如果目标路径里的子文件夹(比如E:\DB Backups\A)可能还不存在,可以加个前置任务自动创建:
- 新增一个文件系统任务,放在移动文件的任务之前
- 这个任务的操作选
创建目录 - 新增变量
TargetFolderPath,表达式设为@[User::DestinationRoot] + LEFT(@[User::SourceRelativePath], FINDSTRING(@[User::SourceRelativePath], "\\", 1) - 1),用来提取子文件夹路径(比如E:\DB Backups\A) - 把这个任务的目标连接设为
TargetFolderPath变量 - 用优先约束连接创建任务和移动任务,设置为「完成时」执行
这样配置完,包运行时就会自动把文件移到对应的子文件夹里啦!
内容的提问来源于stack exchange,提问作者jessiew




