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

时间:2015-04-13 20:42:54

标签: batch-file escaping google-bigquery

使用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上显示的内容进行调整,但无济于事。

这里有什么问题? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

我想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"

答案 1 :(得分:1)

对不起。我觉得这里有一个混乱。

当参数括在引号中时,它可能包含特殊的批处理字符,无需转义它们;唯一有问题的情况是启用延迟扩展并且参数包含感叹号或插入符号。例如,此行正常工作:

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中作为单个^>处理的>相同。蝙蝠。但是,如果使用CALL,则转义将被复制并传递^^>

结论:不要逃避>字符。