从 Powershell 调用 bteq

Calling bteq from Powershell

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

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

据我理解语法是:

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

我目前正在尝试将 bat 实现转换为 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

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

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

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

编辑 如果我尝试使用 ` 转义 <,则会出现以下错误,就好像没有获取参数一样:

bteq.exe :  *** Warning: You must log on before sending SQL requests. 
At C:\...\Deploy.ps1:20 char:76
+ (Get-Content -Path $configFile) | Select-Object -Skip 1 | ForEach-Object { bteq. ...
+                                                                            ~~~~~
+ CategoryInfo          : NotSpecified: ( *** Warning: Y... SQL requests. :String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

有人能够阐明在指定要使用的文件时如何在 PowerShell 中调用 bteq 命令吗?

在 powershell 中 尝试 cat <your-bteq-file> | bteq 调用您的 bteq 文件

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

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

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

在看到 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。