【问题标题】:Powershell Script for finding and replacing values in an XML file using a CSV file as parameters使用 CSV 文件作为参数查找和替换 XML 文件中的值的 Powershell 脚本
【发布时间】:2013-10-11 18:03:45
【问题描述】:

我创建了一个生成 XML 文件的 Powershell 脚本。所有 XML 数据都在脚本中,无论需要重复什么项目,我都会根据 CSV 中的行数(减去标题)循环它们。

脚本的下一部分是我遇到问题的地方。基于相同的 CSV,我现在正在尝试修改生成的 XML 文件并进行查找和替换。我从循环中生成了需要替换的单词,例如 FName1、FName2、FName3、LName1、LName2、LName3。

我的问题是,每当我尝试从 CSV 文件中替换这些单词时,除非我硬编码 FName1、FName2 等,否则什么都不会被替换。

这是我知道不正确的代码....基本上我希望它查找 FName(1,2,3 etc) 和 LName(1,2,3 etc) 的任何实例并将其替换为 $ _.FirstNames and $_.LastNames。

$c = Import-Csv test.csv

Get-ChildItem test.xml | Foreach-Object {
  $xmldoc = (Get-Content test.xml | Out-String)
  $i = 0
  $c | Foreach-Object {
    $xmldoc = $xmldoc -replace 'FName' + $i++,$_.FirstNames `
    -replace 'LName' + $i,$_.LastNames
  }

  $xmldoc | Set-Content test.xml
}

这是 test.xml 文件的一部分

<ItemRef ItemID="FName1" Mandatory="No"/>
<ItemRef ItemID="FName2" Mandatory="No"/>
<ItemRef ItemID="FName3" Mandatory="No"/>
<ItemRef ItemID="LName1" Mandatory="No"/>
<ItemRef ItemID="LName2" Mandatory="No"/>
<ItemRef ItemID="LName3" Mandatory="No"/>

这是 test.csv 文件:

FirstNames,LastNames
John,Doe
Jane,Doe
Mike,Smith
Samantha,Fox

任何帮助将不胜感激!

谢谢,

纳斯

【问题讨论】:

  • 我不会修复/改进您的代码,因为您的方法是错误的。 Unix shell/过程思维方式不适用于 Powershell。从对象、它们的属性、方法的角度来思考。不要通过 string find 'n replace. 处理 XML

标签: xml powershell csv


【解决方案1】:

为什么要在 FNameLName 之间增加计数器?
不要使用Get-Content 来读取文件,而是使用[IO.file]::ReadAllText()[IO.file]::ReadAllText() 不会根据换行符将文件分成数组。

【讨论】:

  • 我对 Powershell 还很陌生,但我会用谷歌搜索 [IO.file]::ReadAllText() 并尝试一下。谢谢。
  • Tekno Sal 有一个很好的观点。使用对象而不是字符串会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多