PowerShell命令用于在xml文件中选择一个值并将其替换为另一个xml

时间:2014-07-22 02:15:02

标签: xml powershell

我甚至不知道从哪里开始,但是我可以使用的powershell cmdlet可以使用以下格式读取MDT xml(OperatingSystem.xml),并只获取GUID值(或值)$ captureGUID =" {1a65f870-2247-410a-be71-75b6b975b3d5}"

<oss>
  <os guid="{1a65f870-2247-410a-be71-75b6b975b3d5}" enable="True">
  <Name>Windows 7 ENTERPRISE in Windows 7 Ent x64 install.wim</Name> 
  <CreatedTime>7/21/2014 8:51:10 PM</CreatedTime> 
  <CreatedBy>W2K8R2\Administrator</CreatedBy> 
  <LastModifiedTime>7/21/2014 8:51:10 PM</LastModifiedTime> 
  <LastModifiedBy>W2K8R2\Administrator</LastModifiedBy> 
  <Description>Windows 7 ENTERPRISE</Description> 
  <Platform>x64</Platform> 
  <Build>6.1.7601.17514</Build> 
  <OSType>Windows IBS</OSType> 
  <Source>.\Operating Systems\Windows 7 Ent x64</Source> 
  <IncludesSetup>True</IncludesSetup> 
  <SMSImage>False</SMSImage> 
  <ImageFile>.\Operating Systems\Windows 7 Ent x64\Sources\install.wim</ImageFile> 
  <ImageIndex>1</ImageIndex> 
  <ImageName>Windows 7 ENTERPRISE</ImageName> 
  <Flags>Enterprise</Flags> 
  <HAL>acpiapic</HAL> 
  <Size>11566</Size> 
  <Language>en-US</Language> 
  </os>
<os guid="{67ee1204-ba8f-47d4-9e6c-34a7bb24dd4d}" enable="True">

从前面获取捕获的值并将其替换为另一种格式的另一个xml文件(例如,在此处更新OSGUID)

  <?xml version="1.0" encoding="utf-8" ?> 
  <sequence version="3.00" name="Standard Client Task Sequence" description="A complete task sequence for deploying a client operating system">
    <globalVarList>
      <variable name="OSGUID" property="OSGUID">{bc8e6992-5890-4be2-88af-29208f9ab0d5}</variable> 
      <variable name="DestinationDisk" property="DestinationDisk">0</variable> 
      <variable name="DestinationPartition" property="DestinationPartition">1</variable> 
      <variable name="DestinationOSVariable" property="DestinationOSVariable" /> 

2 个答案:

答案 0 :(得分:0)

PowerShell是这项工作的错误工具。您应该创建一个XSLT转换。使用XSLT,您可以找到一个特定的节点,并轻松将其写入另一个XML表单---或任何其他类型的文档。

以下是您可以在StackOverflow上找到的几个示例之一:
XSLT or XPath: how to find a node with a specific tag and text then extract it into a new xml file?

答案 1 :(得分:0)

你可以在Powershell中做到这一点,你只需要第一个guid吗?因为你的第一个和第二个guid是不同的。您需要使用正则表达式。这样的事情应该有效。

$OSXML = Get-Content OperatingSystem.xml
$regex = 'guid=\"(\{\w+\-\w+\-\w+\-\w+\-\w+\})\"'
ForEach ($Line in $OSXML)
{   $Line -match $regex
}
$captureGUID = $Matches[1]

$ReplacementXML = [xml](Get-Content "NewXML.xml")

($ReplacementXML.sequence.globalVarList.variable | Where-Object { $_.Name -eq "OSGUID" }).'#text' = $captureGUID

$ReplacementXML.Save("C:\Test\NewXML2.xml")

您需要将$ ReplacementXML的Get-Content部分更改为要将GUID导入到的第二个xml文件的名称。然后对于最后一行,将保存位置的名称更改为同一文件的名称,我使用2个单独的名称来验证输出的导入。