扩展ConvertFrom-Json中的变量会响应

时间:2017-02-11 21:47:13

标签: json powershell

我已经构建了一系列JSON文件,这些文件将被各种模块和脚本引用。在JSON中,我引用了脚本/模块所在的PowerShell实例(和范围)中已存在的变量。 问题是ConvertFrom-Json中引用的变量似乎导入了一个文字,因此变量在会话中不会扩展。

当你瞥一眼下面的test.ps1时,你会看到我试图做的事情,以及我的目标是什么(我希望如此)。如果没有,请让我解释一下。有时候我不是最能传达我所追求的东西!

test.ps1

# The following Invoke-WebRequest just pulls in the JSON in this Gist
$JSON = Invoke-WebRequest -Uri 'https://gist.githubusercontent.com/mpearon/a8614d73793c582760a6e2b9668d4f62/raw/2000ded35b6c8f9dd790f36a3169810acd5e3bdf/test.json' |
        ConvertFrom-Json
$ConnectionParams = @{
  ComputerName = $JSON.Server.connectionParameters.ComputerName
  ErrorAction  = $JSON.Server.connectionParameters.ErrorAction
  Credential   = $JSON.Server.connectionParameters.Credential
}
Enter-PSSession @ConnectionParams

test.json

{
  "Server" : {
    "connectionType" : "PSSession",
    "connectionSubType" : "ServerType",
    "securityLevel" : "Level1",
    "connectionParameters" : {
      "ComputerName" : "ServerNameHere",
      "ErrorAction" : "Stop",
      "Credential" : "$Creds"
    }
  }
}

1 个答案:

答案 0 :(得分:3)

对于简单值,您可以像这样强制变量epxansion:

$response = Invoke-WebRequest -Uri ... | Select-Object -Expand Content
$json = $ExecutionContext.InvokeCommand.ExpandString($response) |
        ConvertFrom-Json

但是,这通常不适用于PSCredential对象等复杂数据类型。这些将作为字符串表示插入。

如果您确切知道需要扩展哪个选项,可以使用Invoke-Expression

$json = Invoke-WebRequest -Uri ... |
        Select-Object -Expand Content |
        ConvertFrom-Json
$json.Server.connectionParameters.Credential = Invoke-Expression $json.Server.connectionParameters.Credential

除此之外,我不认为PowerShell有内置的东西可以做你想要的。此外,我没有看到从网络加载复杂数据结构的位置,然后用局部变量填充(任意?)部分是有用的。