我正在使用TCL语法将文件上传到使用cURL的Google云端硬盘子目录。基于documentation,有一个名为parent
的属性,用于保存子文件夹ID。它可以在"试用API部分" - 如果删除parents
参数(然后将文件上传到GDrive根文件夹),下面的代码工作正常。
根据文档,这是参数的样子:
parents : [{"id" : "0B-b5yS-0xCQjVEcyMm9hYmtqd0k"}]
现在我想将其改编为我当前的代码,但是会发生错误。我认为这个问题与TCL语法有关,但由于我并不熟悉这种语言,所以我花了几个小时的时间尝试和错误才能让它完全失效。我尝试做的是设置一个参数fileMetaData
,它包含元数据的所有必要值(即使是parent
文件夹列表),此外我还定义了一个存储最终值的参数curlCommand
cURL声明。在curlCommand
中,我提供fileMetaData
,最后我在 eval exec 语句中使用cURL执行命令。
我认为这与替代有关?但我真的输了。我已经尝试过双引号,甚至在花括号和方括号之前使用反斜杠。我总是收到错误。
这是当前的代码:
set fileMetaData "metadata={name : '$backupFile', title : '$fileName', \
description : 'Backup file from $today', \
parents : [{id : '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}] }"
set curlCommand "-H \"GData-Version: 3.0\" \
-H \"Authorization: Bearer $accessToken\" \
-F \"$fileMetaData;type=application/json;charset=UTF-8\" \
-F \"file=@$backupFile\" \
https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart"
catch { eval exec /usr/local/addons/prtz/curl -k $curlCommand}
运行代码时收到的错误消息是:
invalid command name "id: '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'"
while executing "{id: '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}"
也许很重要:我必须使用原生 TCL 8.2 而不需要任何其他库(即支持JSON)。 我感谢任何有助于解决问题的输入!
感谢。
答案 0 :(得分:1)
用list命令逐位构建命令行是最容易的。
# Your immediate problem was the square brackets building this value; backslash needed
set fileMetaData "{name : '$backupFile', title : '$fileName', \
description : 'Backup file from $today', \
parents : \[{id : '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}\] }"
set curlCommand {/usr/local/addons/prtz/curl -k}
lappend curlCommand -H "GData-Version: 3.0"
lappend curlCommand -H "Authorization: Bearer $accessToken"
lappend curlCommand -F "metadata=$fileMetaData;type=application/json;charset=UTF-8"
lappend curlCommand -F "file=@$backupFile"
lappend curlCommand "https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart"
catch { eval exec $curlCommand }
# If you were using a supported Tcl (8.5 and later) I'd say use this instead:
# catch { exec {*}$curlCommand }
# but since we've built with lappend there's no surprises anyway.
使用list命令正确构建列表要容易得多。在这种情况下,您还可以使用format
:
set parentID 0B-b5yS-0xCQjVEcyMm9hYmtqd0k
set description "Backup file from $today"
set fileMetaData [format \
{{name : '%s', title : '%s', description : '%s', parents : [{id : '%s'}]}} \
$backupFile $fileName $description $parentID]
(另一种选择是subst -nocommands
,但对于这种情况,我认为format
更整洁。)