从Json响应扩展转换器内的变量

从Json响应扩展转换器内的变量,json,powershell,Json,Powershell,我已经构建了一系列JSON文件,这些文件将被各种模块和脚本引用。在JSON中,我引用了脚本/模块所在的PowerShell实例和范围中已经存在的变量。 问题是ConvertFrom Json中引用的变量似乎导入了一个文本,因此变量在会话中不会展开 当您浏览下面的test.ps1时,您将看到我尝试过做什么,以及我的目标是什么。如果没有,请让我解释一下。有时我并不擅长表达我的追求 测试1.ps1: 下面的invokewebrequest只是在本文中引入了JSON $JSON=调用WebRequest

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

当您浏览下面的test.ps1时,您将看到我尝试过做什么,以及我的目标是什么。如果没有,请让我解释一下。有时我并不擅长表达我的追求

测试1.ps1:

下面的invokewebrequest只是在本文中引入了JSON $JSON=调用WebRequest-Uri'https://gist.githubusercontent.com/mpearon/a8614d73793c582760a6e2b9668d4f62/raw/2000ded35b6c8f9dd790f36a3169810acd5e3bdf/test.json' | 从Json转换 $ConnectionParams=@{ ComputerName=$JSON.Server.connectionParameters.ComputerName ErrorAction=$JSON.Server.connectionParameters.ErrorAction 凭据=$JSON.Server.connectionParameters.Credential } 输入PSSession@ConnectionParams test.json:

{ 服务器:{ 连接类型:PSSession, 连接子类型:服务器类型, 安全级别:级别1, 连接参数:{ ComputerName:ServerName此处, 错误操作:停止, 凭证:$Creds } } }
对于简单的值,可以强制变量epxansion,如下所示:

$response = Invoke-WebRequest -Uri ... | Select-Object -Expand Content
$json = $ExecutionContext.InvokeCommand.ExpandString($response) |
        ConvertFrom-Json
但是,这通常不适用于PSCredential对象等复杂数据类型。这些将作为其字符串表示形式插入

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


除此之外,我认为PowerShell没有内置的东西可以满足您的需求。此外,我看不到从网络加载复杂数据结构然后填充任意内容的地方?带有局部变量的部分变量将非常有用。

对于简单的值,您可以强制变量epxansion,如下所示:

$response = Invoke-WebRequest -Uri ... | Select-Object -Expand Content
$json = $ExecutionContext.InvokeCommand.ExpandString($response) |
        ConvertFrom-Json
但是,这通常不适用于PSCredential对象等复杂数据类型。这些将作为其字符串表示形式插入

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


除此之外,我认为PowerShell没有内置的东西可以满足您的需求。此外,我看不到从网络加载复杂数据结构然后填充任意内容的地方?其中带有局部变量的部分将非常有用。

请不要将问题的相关部分放在外部网站上,尤其不要放在Gist上。一旦要点消失,您的问题将变得毫无用处。请不要将问题的相关部分放在外部网站上,尤其不要放在要点上。一旦要点消失,您的问题将变得毫无用处。Invoke WebRequest不是我在生产中如何处理它——只是为了这些观众的利益。它将被存储在一个网络位置,并用于整个公司的多个模块——类似于数据主干网。不同的连接类型,即:到文件/共享服务器的会话与Exchange端点的会话需要不同的凭据-但是凭据将在引用JSON之前在会话中定义-这就是我需要本地扩展的原因。你在那里列出的第二个选项对我有用。非常感谢你!Invoke WebRequest不是我在生产中处理它的方式——只是为了这个受众的利益。它将被存储在一个网络位置,并用于整个公司的多个模块——类似于数据主干网。不同的连接类型,即:到文件/共享服务器的会话与Exchange端点的会话需要不同的凭据-但是凭据将在引用JSON之前在会话中定义-这就是我需要本地扩展的原因。你在那里列出的第二个选项对我有用。非常感谢你!