【问题标题】:Powershell - JSON string with variables as parameter [duplicate]Powershell - 以变量为参数的 JSON 字符串 [重复]
【发布时间】:2021-12-11 17:04:58
【问题描述】:

我正在尝试在 PowerShell 中使用 Databricks CLI。我需要传递 JSON 字符串作为参数。

我有两个变量 - job_id 等于 10parameterValue 等于 some string

我使用了 4 种不同的组合,但仍然收到 Error: JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 的错误

使用的代码:

databricks jobs run-now --job-id $job_id --notebook-params "{""parameterName"":""$parameterValue""}"
databricks jobs run-now --job-id $job_id --notebook-params "{`"parameterName`":`"$parameterValue`"}"
databricks jobs run-now --job-id $job_id --notebook-params '{"parameterName":"$parameterValue"}'

【问题讨论】:

  • 第一个不起作用,因为转义 " 是用反引号字符完成的。第三个不起作用,因为$parameterValue 括在反引号字符中时不会扩展为其值。仍然是第二个,试试$("{`"parameterName`":`"$parameterValue`"}")"{`"parameterName`":`"$($parameterValue)`"}"
  • "期望用双引号括起来的属性名称" .. 我怀疑这是所有情况下的错误消息,因为有些显然满足这个要求。您是否还遇到其他错误?您是否尝试过不扩展的简单文字字符串来缩小问题范围?
  • PowerShell 7.1 的可悲现实是,在传递给 的参数中需要一个 额外的手动\ -转义嵌入的 " 字符外部程序。这可能在 7.2 中得到修复,可能需要选择加入。有关详细信息,请参阅链接副本的 this answer

标签: python powershell databricks databricks-cli


【解决方案1】:

尝试构建自己的序列化字符串是一种不好的做法,而是使用预期的方法和cmdlets(例如ConvertTo-Json):

$job_id = 10
$parameterName = 'Some String'
$Data = @{
    job_id = $job_id
    parameterName = $parameterName
}
$Json = ConvertTo-Json $Data
databricks jobs run-now --job-id $job_id --notebook-params $Json

或压缩:

databricks jobs run-now --job-id $job_id --notebook-params (ConvertTo-Json -Compress @{ parameterName = $parameterName })

【讨论】:

  • 谢谢,但是由于字符串Error: Got unexpected extra argument (String })中的空格还是有错误
  • 这与命令本身有关,像 databricks jobs run-now --job-id $job_id --notebook-params "$Json"databricks jobs run-now --job-id $job_id --notebook-params "$(ConvertTo-Json -Compress @{ parameterName = $parameterName })" 可能只是工作
【解决方案2】:

好的,所以我做的是

  1. 编写 python 代码以打印传递的参数
if __name__ == '__main__':
    import sys
    print(sys.argv[1])

2. 使用不同的设置对此进行了测试,例如:

输入:$s="{`"parameterName`":`"$parameterValue`"}"

powershell 输出:{"tableName":"some_string"}

python 输出:{parameterName:some_string}

所以python完全忽略了双引号,即使它们被转义了。

我不得不:

  1. 转义 (\) 转义 (`) 字符:

powershell 输入:$s="{\`"parameterName\`":\`"$parameterValue\`"}"

powershell 输出:{\"parameterName\":\"some_string\"}

python 输出:{"parameterName":"some_string"}



我还没有弄清楚的唯一问题是当$parameterValue 变量包含空格时,它不起作用:

powershell 输入:

$parameterValue='some string'
$s="{\`"parameterName\`":\`"$parameterValue\`"}"

powershell 输出:{\"parameterName\":\"some string\"}

python 输出:{"parameterName":"some

【讨论】:

  • 主要问题 - 对\ -escaping 的意外需求 - 出现在 PowerShell 方面(请参阅链接副本)。空格的问题必须是不相关的,因为像 "{\`"parameterName\`": \`"some string\`"}" 确实 之类的东西会被外部程序视为 verbatim{"parameterName": "some string"},即有效的 JSON,至少 PowerShell 7.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2014-06-10
  • 2011-10-22
  • 2013-05-27
相关资源
最近更新 更多