【问题标题】:Problem to access Json data after ConvertFrom-Json in Powershell [duplicate]在Powershell中ConvertFrom-Json之后访问Json数据的问题[重复]
【发布时间】:2019-04-16 11:04:40
【问题描述】:

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

{
"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

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

谢谢!

【问题讨论】:

    标签: json powershell


    【解决方案1】:

    发生这种情况是因为 powershell 解释器如何读取您提供给它的内容。基本上 . 不被视为 powershell 变量的一部分。它被认为是一个字符串字符。因此它会返回你的变量并添加.Front.VHDDesintationPath 到它。试试这个:

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

    【讨论】:

    • 成功了!谢谢。我尝试只使用括号,但我错过了额外的 $ 符号。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多