【发布时间】:2017-05-05 19:21:21
【问题描述】:
我对如何从 SSIS 运行参数化 PS 脚本进行了大量研究。我在运行参数化脚本时遇到问题。 PS脚本如下,如果我将参数硬编码到脚本中,它会按预期运行:
Param ([string]$filepath,[string]$filename)
$Path = $filepath
$InputFile = (Join-Path $Path $filename)
$Reader = New-Object System.IO.StreamReader($InputFile)
While (($Line = $Reader.ReadLine()) -ne $null) {
If ($Line -match 'FILE\|([^\|]+)') {
$OutputFile = "$($matches[1]).txt"
}
Add-Content (Join-Path $Path $OutputFile) $Line
}
在 SSIS 执行流程任务中运行,我正在尝试通过如下表达式构建 Arguments 命令:
"-ExecutionPolicy ByPass -File " + @[User::vPSScriptLocation] + " " + @[User::vFilePath]+ " "+ @[User::vFileName]
计算表达式得到以下结果:
-ExecutionPolicy ByPass -File \\WorkDirectory\Script.ps1 \\transfer datafile.data
执行时,任务失败。 .ps1 从工作目录中删除,SSIS 给出以下错误代码:
Error: 0xC0029151 at Execute powershell script, Execute Process Task: In Executing "C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe" "-ExecutionPolicy ByPass -File \\WorkDirectory\Script.ps1 \\transfer datafile.data" at "", The process exit code was "-196608" while the expected was "0".
看起来它在不应该的地方得到了一个空字符串?任何指针表示赞赏。
【问题讨论】:
-
所以你的进程应该读取文件“\\transfer\datafile.data”?这不是有效的 UNC 路径。如果您运行错误中显示的代码,您的脚本是否有效?它看起来也将所有参数作为一个字符串传递,但这可能只是错误的编写方式。必须检查
-File是否支持 UNC。 This question 在尝试使用文件的 UNC 路径时出错。 -
它应该读取 \\WorkDirectory\Script.ps1,这又不是 UNC。我也尝试在语音标记中传递参数,但得到相同的结果。它可能是 UNC,尽管它从读取位置删除 ps1 文件是非常奇怪的行为。
-
"\\WorkDirectory\Script.ps1" 不是有效路径,因此我认为 powershell 不知道您要运行什么。那应该是相对路径还是什么?我敢打赌,您没有 PowerShell 正在寻找的名为 WorkDirectory 的服务器。同样的问题应该发生在 in 您的脚本中,这就是我在您构建无效的类似路径之前试图指出的问题
-
它有一个正确的服务器名称,\\WorkDirectory 只是说明性的。就像我在原始问题中所说的那样,如果我在 PS ISE 中运行这个脚本,并为参数分配值,它就可以正常工作。我猜这是因为 SSIS 和 UNC 路径在此任务中缺乏兼容性。
-
它有一个正确的服务器名称,\\WorkDirectory 只是说明性的。 好的。这很好,但您应该使用正确的命名示例。由于格式错误的路径可能是您问题的一部分,因此我专注于您问题的那一部分,即“\\Server\Scripts\Script.ps1”。你真正的路径中有空格吗?
标签: sql-server powershell ssis