2017-02-11 3 views
0

Ich habe eine Reihe von JSON-Dateien erstellt, auf die von verschiedenen Modulen und Skripten verwiesen wird. In JSON verweise ich auf Variablen, die bereits in der PowerShell-Instanz (und dem Bereich) vorhanden sind, in dem sich das Skript/Modul befindet. Das Problem besteht darin, dass die in ConvertFrom-Json referenzierten Variablen scheinbar ein Literal importieren, also die Variablen aren nicht erweitern, sobald sie in der Sitzung sind.Erweitern von Variablen in ConvertFrom-Json-Antworten

Wenn Sie unten einen Blick auf test.ps1 werfen, werden Sie sehen, was ich versucht habe, und was mein Ziel ist (hoffe ich). Wenn nicht, bitte ich um eine Erklärung. Manchmal bin ich nicht der Beste, um zu vermitteln, wonach ich suche!

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

Bitte stellen Sie keine relevanten Teile Ihrer Frage auf externen Seiten, und insbesondere nicht auf Gist. Ihre Frage wird nutzlos, sobald der Kern verschwindet. –

Antwort

3

Für einfache Werte könnten Sie variable epxansion wie diese zwingen:

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

jedoch, dass in der Regel nicht mit komplexen arbeiten Datentypen wie PSCredential Objekte. Diese würden als ihre String-Repräsentation eingefügt werden.

Wenn Sie wissen, welche Option genau Sie erweitert brauchen Sie Invoke-Expression verwenden:

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

Abgesehen davon glaube ich nicht Powershell hat etwas integrierte in das würde tun, was Sie wollen. Außerdem kann ich nicht erkennen, wo komplexe Datenstrukturen aus dem Netzwerk geladen werden und dann (willkürliche?) Teile davon mit lokalen Variablen füllen.

+0

Die Invoke-WebRequest ist nicht so, wie ich es in der Produktion handhaben werde - nur zum Vorteil dieser Zielgruppe. Es wird auf einem Netzwerkstandort gespeichert und für mehrere Module im gesamten Unternehmen verwendet - eine Art Datenbackbone. Verschiedene Verbindungstypen (zB: PSSessions zu File/Share Servern vs. Exchange Endpoints) benötigen unterschiedliche Zugangsdaten - aber die Zugangsdaten werden in der Sitzung definiert, bevor der JSON referenziert wird - deshalb brauche ich die lokale Erweiterung. Die zweite Option, die Sie dort aufgelistet haben, funktioniert für meine Zwecke. Vielen Dank! –