【问题标题】:bq tool, bat file | escaping characters not working when CALLbq 工具,bat 文件 | CALL 时转义字符不起作用
【发布时间】:2015-04-14 14:26:01
【问题描述】:

使用 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.bat 吗?
  • 感谢您的来信。不,我不能改变它。

标签: batch-file escaping google-bigquery


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对不起。我认为这里存在混淆。

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

    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 要求 > 被转义,即使用引号括起来:stackoverflow.com/questions/22356037/…。我尝试按照您的建议进行操作,但没有成功。顺便说一句,bq 是一个基于 python 的工具,所以它可能是一个比我们常规的 bat 文件更复杂的文件。 :-(
    • 如果 bq 命令不是bq.bat 文件,那么它不需要调用来返回调用批处理文件!也许我错过了什么?
    • 是一个触发python代码的cmd文件。它需要 CALL 才能返回到原始的 bat 文件。我会沿着你好心建议的道路继续探索。 ````摘自 bq.cmd @echo off rem 版权所有 2013 Google Inc. SETLOCAL rem rem CLOUDSDK_ROOT_DIR rem CLOUDSDK_PYTHON rem CLOUDSDK_PYTHON_ARGS (u) python 解释器参数 rem CLOUDSDK_PYTHON_SITEPACKAGES (u) 使用 python 站点包SET CLOUDSDK_ROOT_DIR=%~dp0.. SET PATH=%CLOUDSDK_ROOT_DIR%\bin\sdk;%PATH% IF "%CLOUDSDK_PYTHON%"=="" (SET CLOUDSDK_PYTHON=python.exe)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2017-12-02
    • 2015-01-22
    • 2021-12-25
    相关资源
    最近更新 更多