【问题标题】:String replacement in file only keeping the last change文件中的字符串替换仅保留最后一次更改
【发布时间】:2020-02-27 19:01:16
【问题描述】:
        $injectpoint = %{ [Regex]::Matches($file, "DMG>D8>$dob.+?REF>EA>$mrn") } | %{ $_.Value }

        foreach ($data in $injectpoint)
        {
            $file = Get-Content C:\utils\foo\0000000.txt
            inject $file $eth $race $lang $data $dob 
        }
    }
}

function inject($file, $eth, $race, $lang, $injectpoint, $dob)
{
    Set-Location C:\utils\boo\
    $injector = "$race" + ":" + $eth + ":" + $lang
    $newString = $data -replace "DMG>D8>$dob", "DMG>D8>$dob>$injector"
    $file.Replace($data, $newString) | Set-Content C:\utils\foo\testfile.txt
}

我的想法是,因为我的循环在循环开始时将文件重新读入内存,它会将新的更改读入内存,然后它可以在不删除我循环的更改的情况下设置新内容在之前的迭代中制作。

我试图更改文件读入内存的位置(循环外,注入函数内),但当前迭代是我能看到脚本最后一次注入的最远位置,所有其他的都被覆盖.

【问题讨论】:

  • 我可能只是太笨了,无法理解发生了什么,但我不明白。您正在读取0000000.txt,对读取的数据进行更改,然后将更改输出到testfile.txttestfile.txt 将只有最后一次更改 $injectpoint 的最后一次迭代,这是你不喜欢的?而Set-Content -Append 将保留$injectionpoint 的每次迭代所做的所有更改,这也是你不喜欢的?您的函数定义也有错误,因为它有参数injectpoint,但实际上在其脚本块中使用了$data
  • @AdminOfThings 我是个白痴,不是你。我想我在我的逻辑中发现了问题。我真的很感谢你问这个问题。我真的很爱你。当然,我不会正确获取信息,因为我没有将新更改保存到旧文件中。我已经盯着这个看了好几天了,我想我真的只是需要一双新的眼睛。
  • @AdminOfThings 如果你想发布我不会收到我的数据,因为我将它保存到一个新文件而不是我的旧文件,我会接受答案。它总是最简单的解决方案

标签: powershell loops logic


【解决方案1】:

这里的问题是在循环迭代期间,您正在读取文件 0000000.txt 并将更改保存到 testfile.txt。由于您在字符串替换后从未阅读过testfile.txt,因此您看不到更新后的字符串。

【讨论】:

    【解决方案2】:

    如果我猜对了,您想将新内容添加到文件 C:\utils\foo\testfile.txt,为此您必须使用 Add-Content cmdlet

    【讨论】:

    • 添加内容,会将整个文件附加到该文件。我想要的只是保留对字符串的更改,但它们目前正在被覆盖。为了更清楚地说明,我正在做很多就地字符串替换来保存更改,然后转到需要进行的下一个替换。感谢您抽出宝贵时间回复我的问题,但我非常感谢。
    • 您从一个文件Get-Content C:\utils\foo\0000000.txt 读取,然后您对其进行了一些更改并将内容写入另一个文件C:\utils\foo\testfile.txt 您能解释一下您有什么输入和输出
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2011-07-26
    • 2011-02-13
    • 2014-08-15
    相关资源
    最近更新 更多