批处理文件在某些计算机上未完成 - 使用 Google Developer Console
Posted
技术标签:
【中文标题】批处理文件在某些计算机上未完成 - 使用 Google Developer Console【英文标题】:Batch file doesn't complete on certain computers - Uses Google Developer Console 【发布时间】:2017-04-13 21:32:00 【问题描述】:问题
我有以下批处理文件(见下文),在我自己的计算机上成功运行。它运行一个用 GooeyParser 编译的 Python 可执行文件,通过临时文本文件将一些变量传递给批处理脚本,然后使用 Google Dev Console 将文件上传到 GSC,然后是 BigQuery。
在我同事的计算机上,批处理脚本在gsutil
命令之后停止运行。没有错误消息,脚本只是停止运行。
各个命令在他的计算机上成功运行。
有谁知道为什么批处理脚本只能部分运行?
批处理文件
::spawns as a subprocess to avoid console window closing and losing error messages
if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )
::python script writes out file location to temporary file
"BQ Single File Upload - dont run by itself.exe"
SET /p FILEUPLOAD=<temp_file_path
SET /p FILENAME=<temp_filename
SET /p DATASET=<temp_dataset
SET /p TABLE=<temp_table
SET /p SCHEMA=<temp_schema
DEL temp_file_path
DEL temp_filename
DEL temp_dataset
DEL temp_table
DEL temp_schema
gsutil cp %FILEUPLOAD% "gs://our_data/%FILENAME%"
cmd.exe /c bq mk %DATASET%
bq load --max_bad_records=5 --skip_leading_rows=1 --allow_quoted_newlines --schema %SCHEMA% %DATASET%%TABLE% "gs://our_data/%FILENAME%"
PAUSE
【问题讨论】:
你为什么一直把它称为 BASH 脚本? 只看其他关于编译python脚本的问题,你的电脑上可能有一些DLL在另一台电脑上不存在。 您是从命令提示符窗口中运行批处理文件以避免命令进程自动关闭以便能够看到错误消息,还是您只是双击批处理文件导致如果 Windows 命令处理器停止执行批处理文件,则自动关闭? 也许它有助于将所有内容括在引号中,其中可能包含一个空格,例如gsutil cp "%FILEUPLOAD%" "gs://our_data/%FILENAME%"
。最好指定每个控制台应用程序使用文件扩展名运行,如果可能的话也使用完整路径。例如,如果gsutil
是文件扩展名为.exe
的可执行文件,请在批处理文件gsutil.exe
中使用。否则,可能会出现gsutil.bat
,并且该文件首先由命令处理器找到,这会导致执行此批处理文件而不会返回您的批处理文件,因为没有使用命令call
。
@Squashman 好的,所以粘糊糊的可执行文件(即编译的 python 脚本)在他的计算机上自行正确运行,所以我不认为是这样
【参考方案1】:
添加电话,(谢谢@Mofi)。这是最终脚本,现在可以在我们的两台计算机上运行。
::spawns as a subprocess to avoid console window closing and losing error messages
if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )
::python script writes out file location to temporary file
"BQ Single File Upload - dont run by itself.exe"
SET /p FILEUPLOAD=<temp_file_path
SET /p FILENAME=<temp_filename
SET /p DATASET=<temp_dataset
SET /p TABLE=<temp_table
SET /p SCHEMA=<temp_schema
DEL temp_file_path
DEL temp_filename
DEL temp_dataset
DEL temp_table
DEL temp_schema
call gsutil cp %FILEUPLOAD% "gs://our_data/%FILENAME%"
call cmd.exe /c bq mk %DATASET%
call bq load --max_bad_records=5 --skip_leading_rows=1 --allow_quoted_newlines --schema %SCHEMA% %DATASET%%TABLE% "gs://our_data/%FILENAME%"
PAUSE
【讨论】:
您不需要将 CALL 与 cmd.exe 一起使用。你应该能够做到这一点。call bq mk %DATASET%
这是一个很好的观点,我认为他们在这一点上的目的是相同的(如果命令失败 - 继续)以上是关于批处理文件在某些计算机上未完成 - 使用 Google Developer Console的主要内容,如果未能解决你的问题,请参考以下文章