从 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。
我目前生成一个 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。