如何将JSON对象作为参数传递给另一个PowerShell脚本

4

我很新于powershell技术,需要一些帮助。

我想将一个json对象作为参数传递给另一个ps1文件。从搜索得知,我需要将其从json字符串转换为powershell对象。如果我错了,请纠正我。这就是我正在做的事情:

调用脚本:

$jsonParams = "{
     `"TaskName`": `"$taskName`",
      `"ExitCode`": `"$exitCode`",
      `"ErrorMessage`": `"$errorMessage`"
   }

$jsonObject = $jsonParams | ConvertFrom-Json
$argumentList = @($param1, $param2, $jsonObject) 

Invoke-Expression "& `"$scriptPath`" $argumentList"

在所谓的脚本中,它被称为 -
param (
    [string]$param1,
    [string]$param2,
    [Microsoft.PowerShell.Commands.JsonObject]$jsonObject
)

但是,调用脚本会抛出错误。

ConvertFrom-Json : Invalid object passed in, ':' or '}' expected. (21): {

这段代码有什么问题?另外,在将json对象传递给被调用的脚本之后,我应该如何访问它的值。
谢谢!
1个回答

6

你的JSON格式不正确。我认为核心问题在于你在JSON末尾有一个逗号。另外,你在声明中没有关闭开头的引号。

如果你使用here-string,可能会更容易些。这样,你就不必使用那么多反引号了。

$jsonParams = @"
{
     "TaskName": "$taskName",
      "ExitCode": "$exitCode",
      "ErrorMessage": "$errorMessage"
   }
"@

$jsonObject = $jsonParams | ConvertFrom-Json

$jsonObject已经是自定义对象,不再是JSON。您无需对其进行任何特殊处理。在param块中删除类型,只需在脚本中调用属性即可。

param (
    [string]$param1,
    [string]$param2,
    $jsonObject
)
$jsonObject.TaskName

这只是一个部分答案,因为您仍然会在类型转换时遇到错误。我不使用它,所以除了文本不再是JSON格式之外,我不确定问题在哪里。 - Matt
那只是我在提问时打错了,实际上我的代码中有更多参数。所以我复制粘贴了其中几个。而且,引号也已经正确地关闭了。就像你的代码中展示的那样,我添加了here-string头部,但还是出现了同样的错误:( - Saurabh
你能展示一下你传递给变量的json示例吗?可以将herestring或字符串打印到http://jsonlint.com/中,以查看它的问题所在。我感觉你现在正在隐藏一个语法错误。 - Matt
好的,抱歉我的错。在读取形成我的JSON字符串的ini文件值时出现了一些问题。我已经修复了这个问题,并在上面的链接上进行了检查,它显示它是有效的JSON。此外,那个错误现在已经消失了,但是如果我尝试使用您的代码访问目标文件中的JSON值,则不会打印任何内容。 - Saurabh
FYI.. @{TaskName=setup; ExitCode=1; ErrorMessage=NoError;} 这是在执行 ConvertFrom-Json 后的输出。 - Saurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接