SSIS调用PowerShell生成文件时无法自动添加日期的问题
解决SSIS Execute Process Task执行PowerShell脚本日期变量问题
问题根源
- 原脚本用单引号包裹输出路径,PowerShell会将单引号内内容视为字面量,导致日期变量
$((Get-Date).ToString("yyyyMMdd"))无法解析,直接以字符串形式写入文件名。 - 改成双引号后,SSIS传递参数时,双引号会被命令行(cmd)解析为参数分隔符,导致PowerShell接收到的脚本语法错误,进程返回退出代码1。
解决方案
方案1:转义双引号并指定-Command参数
在SSIS的Execute Process Task中按以下配置设置:
- Executable:
powershell.exe - Arguments:
-Command "Get-ChildItem -Path '\\servername.com\\PRD\\SourceFiles' -Depth 6 -Include *.* -Recurse | Select FullName,Name,LastWriteTime | Export-Csv \"\\servername.com\\ExportFiles\\SourceFileDetails_$((Get-Date).ToString('yyyyMMdd')).txt\" -Delimiter '|' -NoTypeInformation"
说明:
- 用
-Command明确声明要执行的PowerShell命令 - 输出路径的双引号用反斜杠
\转义,避免被cmd识别为参数边界 - 将日期格式中的双引号改为单引号,避免和外层双引号冲突
方案2:将脚本保存为.ps1文件调用
- 创建PowerShell脚本文件
Get-SourceFileDetails.ps1,内容如下:
Get-ChildItem -Path '\\servername.com\\PRD\\SourceFiles' -Depth 6 -Include *.* -Recurse | Select FullName,Name,LastWriteTime | Export-Csv "\\servername.com\\ExportFiles\\SourceFileDetails_$((Get-Date).ToString('yyyyMMdd')).txt" -Delimiter '|' -NoTypeInformation
- 在SSIS的Execute Process Task中配置:
- Executable:
powershell.exe - Arguments:
-File "D:\\Scripts\\Get-SourceFileDetails.ps1"(替换为实际脚本存储路径)
说明: - 直接调用脚本文件,避开SSIS参数传递时的引号解析问题,脚本内变量可正常解析
方案3:用SSIS变量生成带日期的文件名
- 在SSIS中创建字符串变量
@[User::FileName],表达式设置为:
"\\servername.com\\ExportFiles\\SourceFileDetails_" + (DT_WSTR,8)YEAR(GETDATE()) + RIGHT("0" + (DT_WSTR,2)MONTH(GETDATE()),2) + RIGHT("0" + (DT_WSTR,2)DAY(GETDATE()),2) + ".txt"
- 在Execute Process Task的Arguments中引用变量:
-Command "Get-ChildItem -Path '\\servername.com\\PRD\\SourceFiles' -Depth 6 -Include *.* -Recurse | Select FullName,Name,LastWriteTime | Export-Csv '" + @[User::FileName] + "' -Delimiter '|' -NoTypeInformation"
说明:
- 由SSIS生成带日期的文件名,绕过PowerShell变量在参数传递中的解析障碍
验证要点
- 执行前可将Arguments中的命令复制到PowerShell中运行,确认语法无误
- 检查SSIS运行账户是否拥有
\\servername.com\\PRD\\SourceFiles和\\servername.com\\ExportFiles的读写权限
内容的提问来源于stack exchange,提问作者Ern
相关产品推荐
相关产品推荐

