[英]Replace string to a file based from an imported CSV column
如何根据外部 CSV 列将循环中的字符串替换为 myfile.xml?
myfile.xml 包含:
<User Name="USER1">
<Option Name="Pass">45E4EDE</Option>
<Option Name="Salt">P&</Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
/User>
<User Name="USER2">
<Option Name="Pass">4533EDE</Option>
<Option Name="Salt">P&/Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
/User>
<User Name="USER3">
<Option Name="Pass">733EDE</Option>
<Option Name="Salt">P&/Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
/User>
外部 mycsv.csv 包含:
Users,Comments,HomeDir
USER1,account1,c:\folder1
USER2,account2,c:\folder2
USER3,account3,c:\folder3
我需要在“用户”列中使用 foreach USER 将 myfile.xml 中的"Enabled">1
替换为"Enabled">0
。 可能我需要一些像Select-String $_.Users -Context 0,7
这样的代码,但我需要一个提示。 谢谢
一旦您修复了 XML 中的错误,您向我们展示了(没有根标签,各种结束标签没有开头<
,值P&
应该是"P&"
),您可以这样做:
使用区分大小写 XPath
[xml]$xml = @"
<root>
<User Name="USER1">
<Option Name="Pass">45E4EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
</User>
<User Name="USER2">
<Option Name="Pass">4533EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
</User>
<User Name="USER3">
<Option Name="Pass">733EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
</User>
</root>
"@
# loop though the usernames in the CSV, find the node and if found set Enabled to value '0'
foreach ($user in (Import-Csv -Path 'D:\Test\test.csv').Users) {
$node = $xml.root.SelectSingleNode("//User[@Name='$user']/Option[@Name='Enabled']")
if ($node) { $node.InnerText = '0' }
}
# save the updated xml file
$xml.Save("D:\Test\test.xml")
或使用不区分大小写的“dotted”方法
# loop though the usernames in the CSV, find the node and if found set Enabled to value '0'
foreach ($user in (Import-Csv -Path 'D:\Test\test.csv').Users) {
$xml.root.User | Where-Object { $_.Name -eq $user } | ForEach-Object {
($_.Option | Where-Object { $_.Name -eq 'Enabled' }).'#text' = '0'
}
}
# save the updated xml file
$xml.Save("D:\Test\test.xml")
这两种方法都会产生这个 XML 文件作为结果
<root>
<User Name="USER1">
<Option Name="Pass">45E4EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group">
</Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">0</Option>
</User>
<User Name="USER2">
<Option Name="Pass">4533EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group">
</Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">0</Option>
</User>
<User Name="USER3">
<Option Name="Pass">733EDE</Option>
<Option Name="Salt">"P&"</Option>
<Option Name="Group">
</Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">0</Option>
</User>
</root>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.