bq 工具,bat 文件 | CALL 时转义字符不起作用

bq tool, bat file | escaping characters not working when CALL

使用 bq 工具,我可以毫无问题地使用插入符号转义 > 运算符 ^:

bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event^>1"

但是,当我通过 bat 文件调用完全相同的命令时,整个事情都崩溃了。

call bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event^>1"

我明白 call 是这里的问题。我无法删除它,因为我需要在它后面添加 运行 个附加命令(bq extractgsutil cp)。我已尝试对 Escape user input in windows batch file 上显示的内容进行改编,但无济于事。

这是怎么回事? 提前致谢。

对不起。我认为这里有一个混乱。

当参数用引号引起来时,它可能包含不需要转义的特殊批处理字符;唯一有问题的情况是启用延迟扩展并且参数包含感叹号或脱字符号。例如,这条线可以正常工作:

bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event>1"

这样,使用 CALL 命令的同一行也能正常工作:

call bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event>1"

如果您以这种方式转义大于号 ^> 并且不使用 CALL,则传递的字符与在 > 中作为单个 > 处理的字符相同 ^> bq.bat。但是,如果您使用 CALL,则转义符会重复并传递 ^^>

结论:不要转义 > 字符。

我想 bq.cmd 本身包含这样的东西

set param1=%1
set SQL=%~2
python bigQuery.py --%param1% "%SQL%"

所以set SQL=%1行需要转义特殊字符。

但是当您使用 CALL 时,批处理解析器有一个额外的转义阶段,但在它之前还有一个将所有插入符加倍的阶段!

所以你在call bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event^>1"中的字符串被转换为 "SELECT x FROM [presentation_dim.dim_events] WHERE event^^>1"

我认为没有只有插入符号的解决方案可以解决这个问题。

但是您可以通过简单地定义一个包含一个脱字符号的变量来避免这种情况

set "caret=^"
call bq query "SELECT x FROM [presentation_dim.dim_events] WHERE event%%CARET%%>1"