从Powershell打电话给bteq

时间:2015-07-21 19:52:16

标签: powershell batch-file teradata

我目前生成的bat文件包含多个BTEQ调用,以针对Teradata框执行.btq脚本,下面是一个示例CMD调用:

i

据我所知,语法是:

> 指定输入文件& >> 指定输出文件

我目前正在尝试将bat实现转换为PowerShell版本但是我遇到了以下问题:

bteq <Bteq\"File_1.BTQ" >>bteq_output.txt 2>&1

我的PowerShell脚本中调用的结果是什么:

PS C:\...\Deploy.ps1:21 char:81
+ ... -Object { bteq < (Join-Path $deployDir $_) >> bteq_log.txt }
+                    ~
The '<' operator is reserved for future use.
+ CategoryInfo          : ParserError: (:) [],ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RedirectionNotSupported

似乎BTEQ命令行语法与PowerShell中的&lt; 运算符直接冲突。

修改 如果我试图逃避&lt;用`然后我会看到以下错误,好像参数没有被选中:

(Get-Content -Path $configFile) | Select-Object -Skip 1 | ForEach-Object { bteq.exe < (Join-Path $deployDir $_) >> bteq_output.txt }

在指定要使用的文件时,是否有人能够了解如何在PowerShell中调用bteq命令?

3 个答案:

答案 0 :(得分:1)

在PowerShell中

尝试cat <your-bteq-file> | bteq来调用你的bteq文件

答案 1 :(得分:0)

您应该能够将foreach中的部分包装到脚本块中,PowerShell会将其视为一个命令。您只需要以&符号开头即可。

foreach { & {bteq.exe < (Join-Path $deployDir $_) >> bteq_output.txt} }

不在机器上进行测试,您可能需要动态地将脚本块构建为字符串,以便从循环中正确解析变量。

答案 2 :(得分:0)

在看到Shailesh发布的答案之前,我设法通过调用cmd来实现它,如下所示:

(Get-Content -Path $configFile)[1..$fileCount] | ForEach-Object {     
    cmd.exe /C ([String]::Concat(" bteq <", $deployDir, "`\""" , $_ , """ >>output.txt 2>&1"))
    if($LASTEXITCODE -ne 0){
        Write-Host "Error Code" $LASTEXITCODE
        break
    } else {
        Write-Host "Completed" $_ ": Return code" $LASTEXITCODE
    }
};

这里的这组语句迭代从$ configFile变量读取的文本,然后如果错误代码不等于0,则对每个语句调用bteq。