为啥我们不能在一个批处理文件中执行 BigQuery 的多个语句?

Posted

技术标签:

【中文标题】为啥我们不能在一个批处理文件中执行 BigQuery 的多个语句?【英文标题】:Why can't we execute multiple statements of BigQuery in a batch file?为什么我们不能在一个批处理文件中执行 BigQuery 的多个语句? 【发布时间】:2018-12-19 12:56:06 【问题描述】:

我观察到,当我们在 windows 命令提示符下运行简单的 gsutil 或 bq 语句时,它们会成功运行

例如 1:gsutil cp Desktop\MyTraffic.csv gs://BI/

前 2 :bq load --autodetect --replace --source_format=CSV myDataSet.myTable gs://BI/MyTraffic.csv

但是如果我们同时使用像 'runbq.bat' 这样的批处理文件来运行它们,那么只有第一条语句会运行并且命令提示符会立即终止而不会出现任何错误

即使在它们之间添加暂停语句也不会保留命令提示符窗口

runbq.bat:

gsutil cp Desktop\MyTraffic.csv gs://BI/ 
pause
bq load --autodetect --replace --source_format=CSV myDataSet.myTable gs://BI/MyTraffic.csv

【问题讨论】:

您是否检查过转义是否正确完成?通常这是第一个仔细检查。可能会进行一些转义并产生无效命令,重定向输出也可以查看日志。 在每个 BQ 语句之前使用 call 命令:call gsutil cp Desktop\MyTraffic.csv gs://BI/ @Aacini 是的,谢谢,调用语句有效.. 但我可以知道语句调用背后的原因 因为gsutilbq 命令本身就是批处理文件:gsutil.batbq.bat。当一个批处理文件在没有call 命令的情况下调用另一个批处理文件时,执行只是转移到另一个文件,因此当第二个批处理文件结束时,整个过程结束。为了调用第二个批处理文件并在第二个批处理文件结束时返回第一个批处理文件,需要添加call 命令。 @Aacini 是的,非常感谢您详细解释 【参考方案1】:

如Aacini 所述,在"master" 批处理脚本中运行批处理脚本时,需要使用call 命令来暂停当前批处理的执行文件并等待调用的批处理文件完成;这样,该过程可以返回并以原始流程继续。但是,当不添加call命令时,原批处理文件停止,被调用的批处理文件开始执行,不返回原流程。

另一种可能性是使用start 命令,以防您不想锁定 "master" 脚本。

【讨论】:

以上是关于为啥我们不能在一个批处理文件中执行 BigQuery 的多个语句?的主要内容,如果未能解决你的问题,请参考以下文章

为啥线程池定时的任务在熄屏下不能执行

为啥我不能在汇总配置文件中使用 ES6 导入/导出?

为啥我不能在 android 10 中处理文件? [复制]

为啥我们不能在 SQL Server 中的函数内执行存储过程

java程序添上包就不能运行了,为啥?

为啥我们的应用程序不能在 iCloud 中存储一个简单的键/值对?