在Powershell中的ConvertFrom-Json之后访问Json数据的问题

时间:2018-11-13 15:09:53

标签: json powershell

我在配置文件中具有以下数据结构:

{
"ProjectName" : "Test",
"Front" : {
    "Credentials" : {
        "Login" : "Administrator",
        "Password" : "1234"
    },
    "RoleName" : "WebServer",
    "TemplateName" : "WS2016",  
    "VHDSourcePath" : "D:\\VMs\\WS2016\\Virtual Hard Disks",
    "VHDDesintationPath" : "D:\\VMs\\new",
    "SwitchName" : "JoelSwitch"     
}, ...

我使用以下脚本来解析和使用此配置文件:

$Specs = Get-Content -Raw -Path .\Specs.json | ConvertFrom-Json
$NewVmName = $Specs.ProjectName + "_" + "Front"
$TemplateName = $Specs.Front.TemplateName
$Source = $Specs.Front.VHDSourcePath
Write-Verbose "First we copy $Source\$TemplateName.vhdx into 
$Specs.Front.VHDDesintationPath\$NewVmName.vhdx" -Verbose

当我访问json结构时,它具有一种奇怪的行为:在最后一条命令上,我使用局部变量来捕获Source,并且将json结构直接用于目标。 这是我得到的输出:

First we copy D:\VMs\WS2016\Virtual Hard Disks\WS2016.vhdx into @{ProjectName=CSF; Front=;Back=}.Front.VHDDesintationPath\CSF_Front.vhdx

您看到源与配置文件相比是正确的,但是第二个参数就像对象结构,而不是目标属性的值。

如果我这样重写脚本,它将起作用:

$Source = $Specs.Front.VHDSourcePath
$Dest = $Specs.Front.VHDDesintationPath
Write-Verbose "First we copy $Source\$TemplateName.vhdx into $Dest\$NewVmName.vhdx" -Verbose

为什么?我是否需要系统地捕获局部变量中的属性?为什么我不能直接使用该结构?

谢谢!

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为Powershell解释器如何读取您给它的内容。基本上,.不被视为powershell变量的一部分。它被认为是字符串字符。因此,它为您提供了变量,并向其中添加了.Front.VHDDesintationPath。试试这个:

Write-Verbose "First we copy $Source\$TemplateName.vhdx into $($Specs.Front.VHDDesintationPath)\$NewVmName.vhdx" -Verbose