Gsutil: 无法在 Windows 批处理文件中执行顺序 gsutil

创建于 2014-11-01  ·  12评论  ·  资料来源: GoogleCloudPlatform/gsutil

我正在使用 gsutil 在 Windows 中备份我的数据。 我的批处理文件如下所示:

gsutil cp -R a gs://zelon-test/
gsutil cp -R b gs://zelon-test/

但是只执行第一个命令“gsutil cp -R a gs://zelon-test/”。 第二个命令根本没有执行。

最有用的评论

我自己只是偶然发现了这个问题(我运行了几个 gcloud 命令来定期传输数据)。 在您的批处理文件,一定要前言gcloudgsutil或用这样call ,这样的:

call gcloud compute copy-files foobarhost:/home/foobar/blah /my/local/folder --zone my-compute-zone
call gcloud compute copy-files foobarhost:/home/foobar/blah /my/local/folder --zone my-compute-zone
...etc...

使用call可防止批次在其子批次退出时立即退出。 您可以使用 %ERRORLEVEL% 检查调用命令的结果(GCP 脚本对此进行了适当设置)。 另见http://ss64.com/nt/call.html

所有12条评论

嗨 - 第一个命令是否以非 0 退出状态退出? 这将导致批处理文件中止。

我已经测试如下:

一个.exe
echo 退出代码是 %errorlevel%
gsutil cp -R a gs://zelon-test/
echo 退出代码是 %errorlevel%
gsutil cp -R b gs://zelon-test/
echo 退出代码是 %errorlevel%

结果如下:

C:\Temp>test.bat

C:\Temp>a.exe

C:\Temp>echo 退出代码为 0
退出代码为 0

C:\Temp>gsutil cp -R a gs://zelon-test/
正在复制file://a\find.txt [Content-Type=text/plain]...
上传 gs://zelon-test/a/find.txt:36 KB/36 KB

C:\温度>

执行第一个 echo 命令并显示 a.exe 的返回值。 但是第二个 echo 命令(在第一个 gsutil 命令之后)没有执行。 似乎 gsutil 杀死了 Windows 批处理。

我只是尝试在带有 Service Pack 1 的 Windows 7 Ultimate 上运行以下脚本,它对我有用:

\Python27\python.exe \cygwin\usrlocal\bin\gsutil\gsutil cp c:\try.bat gs://my-bucket/1
\Python27\python.exe \cygwin\usrlocal\bin\gsutil\gsutil cp c:\try.bat gs://my-bucket/2


您运行的是哪个版本的 Windows?
如果您更改命令以使用 python 解释器和 gsutil 脚本的完整路径运行 gsutil,会发生什么,类似于我上面所做的?

麦克风

我已经根据您的建议解决了这个问题。 谢谢你。

我使用的是 Windows 8.1 Pro K(韩语),默认的 Python 版本是 2.7.6 64 位
正如你提到的,我尝试使用带有完整路径的python。 然后,出现了一些错误消息,如下所示:

上传 gs://zelon-test/a.exe:14 KB/14 KB
ERROR 1108 16:48:44.817000 http_wrapper.py] 响应返回状态 401,正在重试
ERROR 1108 16:48:44.817000 http_wrapper.py] 重试对 url https://www.googleapis.com/upload/XXXXXXXXXXXXXXXXXX 的请求
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
异常 HttpError 访问后 XXuploadType=multipart fields=generation%2Ccrc32c%2Cmd5Hash%2Csize&alt=json&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&prettyPrint=True&upload
类型=multipart>:响应:<{'status': '401', 'alternate-protocol': '443:quic,p=0.01', 'content-length': '238', 'vary':
'Origin, Referer, X-Origin', 'server': 'UploadServer ("Built on Oct 29 2014 16:52:36 (1414626756)")', 'date': 'Sat, 08 N
ov 2014 07:48:45 GMT', 'content-type': 'application/json; charset=UTF-8', 'www-authenticate': 'Bearer realm="https://acc
ounts.google.com/AuthSubRequest"'}>, 内容 <{
“错误”: {
“错误”:[
{
"域": "全局",
“原因”:“必须”,
"message": "需要登录",
"locationType": "标题",
"location": "授权"
}
],
“代码”:401,
"message": "需要登录"
}
}

所以我使用了“gcloud auth login”,现在我可以正确使用 test.bat。

对于像“gsutil”这样的简短格式,我仍然无法使用那个 test.bat。 像“C:\Python27\python.exe E:\Programs\google-cloud-sdk\platform\gsutil\gsutil.py”这样的完整路径我可以使用那个test.bat

嗨 - 我从来没有能够在没有完全指定路径的情况下让 gsutil 在 Windows 上工作 - 这就是我们建议您在 Windows 上使用 gsutil 的方式(请参阅 https://cloud.google.com 上各种文档的 Windows 选项卡/storage/docs/gsutil_install)。

我正在关闭这个问题,因为它按文档工作。 我很高兴你能让事情顺利进行。

谢谢。 这对我也有帮助。

我自己只是偶然发现了这个问题(我运行了几个 gcloud 命令来定期传输数据)。 在您的批处理文件,一定要前言gcloudgsutil或用这样call ,这样的:

call gcloud compute copy-files foobarhost:/home/foobar/blah /my/local/folder --zone my-compute-zone
call gcloud compute copy-files foobarhost:/home/foobar/blah /my/local/folder --zone my-compute-zone
...etc...

使用call可防止批次在其子批次退出时立即退出。 您可以使用 %ERRORLEVEL% 检查调用命令的结果(GCP 脚本对此进行了适当设置)。 另见http://ss64.com/nt/call.html

这就是答案! 谢谢马蒂!

“似乎总有办法解决问题。” - 麦盖佛

确实,谢谢马蒂,我也不知道。

我有同样的问题,但是当我使用完整路径时,我使用的路径是:“C:\Python27\python.exe”“C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk” \platformgsutilgsutil.py" cp %myfile.txt% gs://%myBucket%/%folder%/ 得到异常:

ServiceException: 401 匿名调用者没有 storage.objects.create 访问 %myBucket%/%folder%/%myfile.txt%

当我使用 gsutil 命令时不会发生这种情况,有什么建议吗?

我有同样的问题,但是当我使用完整路径时,我使用的路径是:“C:\Python27\python.exe”“C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk” \platformgsutilgsutil.py" cp %myfile.txt% gs://%myBucket%/%folder%/ 得到异常:

ServiceException: 401 匿名调用者没有 storage.objects.create 访问 %myBucket%/%folder%/%myfile.txt%

当我使用 gsutil 命令时不会发生这种情况,有什么建议吗?

更新:

我设法解决了使用调用命令为每个操作创建一个新进程作为原始批处理文件进程的子进程的问题。 因此批处理文件中的命令现在看起来像这样:

* 调用 cmd /c gsutil cp %file_1% gs://%bucket%/%folder%/ *
* 调用 cmd /c gsutil cp %file_2% gs://%bucket%/%folder%/ *

请注意, /c 允许原始批处理进程等待其他子进程,因此所有操作看起来都应该如此

此页面是否有帮助?
0 / 5 - 0 等级