【问题标题】:Replace string to a file based from an imported CSV column将字符串替换为基于导入的 CSV 列的文件
【发布时间】:2020-12-31 22:35:05
【问题描述】:

如何根据外部 CSV 列将循环中的字符串替换为 myfile.xml?

myfile.xml 包含:

<User Name="USER1">
            <Option Name="Pass">45E4EDE</Option>
            <Option Name="Salt">P&amp;</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"&gt;1 替换为 "Enabled"&gt;0。 可能我需要一些像Select-String $_.Users -Context 0,7 这样的代码,但我需要一个提示。 谢谢

【问题讨论】:

  • xml 不好(很多错误),您将无法将其转换为内部对象以进行进一步处理。

标签: powershell csv


【解决方案1】:

一旦您修复了您向我们展示的 XML 中的错误(没有根标签,各种结束标签没有开头 &lt;,值 P&amp; 应该是 "P&amp;amp;"),您可以这样做:

使用区分大小写的 XPath

[xml]$xml = @"
<root>
    <User Name="USER1">
        <Option Name="Pass">45E4EDE</Option>
        <Option Name="Salt">"P&amp;"</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&amp;"</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&amp;"</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&amp;"</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&amp;"</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&amp;"</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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2022-06-16
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多