首页 > 解决方案 > Powershell:XML 导入不传递来自 XML 的值

问题描述

尝试从 Xml 导入值

<configuration>
<properties>
<subtype type="integer">1</subtype>
<name type="string">packer-centos8-base-g2-10</name>
</properties>
<settings>
<processors>
<count type="integer">4</count>
</processors>
<memory>
<bank>
<dynamic_memory_enabled type="bool">False</dynamic_memory_enabled>
<limit type="integer">1048576</limit>
<reservation type="integer">512</reservation>
<size type="integer">4096</size>
</bank>
</memory>
</settings>
<AltSwitchName type="string">Default Switch</AltSwitchName>
<boot>
<device0 type="string">Optical</device0>
</boot>
<secure_boot_enabled type="bool">False</secure_boot_enabled>
<notes type="string"> </notes>
<vm-controllers>
<scsi ChannelInstanceGuid="x">
<controller0>
<drive0>
<pathname type="string">
C:\San\SV65\hyper-packer\hyper-packer\hyperv314337150\packer-centos8-base-g2-10.vhdx
</pathname>
<type type="string">VHD</type>
</drive0>
</controller0>
</scsi>
</vm-controllers>
</configuration>

Powershell 命令的输出

PS C:\San\SV65\ps> $jvariables=Get-Content -Raw -Path '.\variables-ps.json' | ConvertFrom-Json
PS C:\San\SV65\ps> $VMXml = Get-ChildItem -path $jvariables.vmfp -recurse -include *.xml

PS C:\San\SV65\ps> write-host $jvariables.vmfp

C:\San\SV65\hyper-packer\hyper-packer\output-centos8-10\Virtual Machines\

PS C:\San\SV65\ps> write-host $VMXml

C:\San\SV65\hyper-packer\hyper-packer\output-centos8-10\Virtual Machines\box.xml

PS C:\San\SV65\ps> write-host $VMbox

PS C:\San\SV65\ps>

$VMbox 得到一个空值,我试图从 xml 中提取一个值

 $name = $VMbox.configuration.properties.name

这是因为 btn“虚拟机”中的空格吗?在 $VMXml 中?

如果它是从 variables.json 填充的

$jvariables=Get-Content -Raw -Path '.\variables-ps.json' | ConvertFrom-Json

{
"psfp":  "C:\\San\\SV65\\ps\\",
"vmfp": "C:\\San\\SV65\\hyper-packer\\hyper-packer\\output-centos8-10\\Virtual Machines\\",
"psmp": "C:\\San\\SV65\\ps\\",
"vmname": ""
} 

如何以这种格式将变量中的值添加为“值”?

即使我添加,它也不会在 powershell 中执行。

总之,我想从 json 中提取路径并尝试从 Xml 中获取值并在代码中使用。

标签: jsonxmlpowershell

解决方案


在变量中获取路径后忘记加载 xml 文件$VMXml
此外,很可能/很可能通过使用

$VMXml = Get-ChildItem -path $jvariables.vmfp -recurse -include *.xml

这个变量包含一个FileInfo 和/或 DirectoryInfo 对象的数组,所以最好使用类似的东西

$VMXml = Get-ChildItem -Path $jvariables.vmfp -Recurse -Filter '*.xml' -File | Select-Object -First 1

只得到一个 FileInfo 对象。

$VMbox然后使用实例化变量

[xml]$VMbox = Get-Content -Path $VMXml.FullName

并使用您的代码从中获取值$name = $VMbox.configuration.properties.name

希望有帮助


推荐阅读