我在配置文件中具有以下数据结构:
{
"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
为什么?我是否需要系统地捕获局部变量中的属性?为什么我不能直接使用该结构?
谢谢!
答案 0 :(得分:1)
之所以发生这种情况,是因为Powershell解释器如何读取您给它的内容。基本上,.
不被视为powershell变量的一部分。它被认为是字符串字符。因此,它为您提供了变量,并向其中添加了.Front.VHDDesintationPath
。试试这个:
Write-Verbose "First we copy $Source\$TemplateName.vhdx into $($Specs.Front.VHDDesintationPath)\$NewVmName.vhdx" -Verbose