我已经构建了一系列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"
}
}
}
答案 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有内置的东西可以做你想要的。此外,我没有看到从网络加载复杂数据结构的位置,然后用局部变量填充(任意?)部分是有用的。