2017-02-11 55 views
0

我已经构建了一系列JSON文件,这些文件将被各种模块和脚本引用。在JSON中,我引用了脚本/模块所在的PowerShell实例(和范围)中已经存在的变量。 问题是,ConvertFrom-Json中引用的变量似乎要导入一个文字,所以变量aren一旦他们在会议中不会扩大。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

请不要将您问题的相关部分放在外部网站上,特别是不要放在Gist上。一旦要求消失,你的问题就会变得毫无用处。 –

回答

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有内置的,将你想要做什么东西。此外,我没有看到从网络加载复杂的数据结构,然后用局部变量填充(任意的?)部分是有用的。

+0

Invoke-WebRequest不是我将如何在生产中处理它 - 仅仅是为了这个受众的利益。 它将存储在一个网络位置,并用于整个公司的多个模块 - 数据骨干网。 不同的连接类型(即:文件/共享服务器与Exchange端点的PSSession)需要不同的凭证 - 但凭据将在引用JSON之前在会话中定义 - 这就是为什么我需要本地扩展。 您在那里列出的第二个选项将适用于我的目的。 非常感谢! –