none
Add text to file RRS feed

  • Pertanyaan

  • Hi

    I am trying to get the content of a file or multiple files, if a pattern exists within the files, i want to start a new line after the pattern, and then add some content. Below is what i have started with, any help or advice would be great. I want to add the line at the bottom after the pattern, but i am stuck.

    $IKey = xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxx
    $fileName = "C:\TempPath\ApplicationInsights.config"
    $content = "<InstrumentationKey>$IKey</InstrumentationKey>"
    $line = <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
    Get-Content $fileName | 
        Foreach-Object {
            if ($_ -match $line) 
            {
                Add-content $fileName "`n$content"
            }



    Thanks

    Shane


    • Diedit oleh Shane W Kamis, 18 April 2019 11.17
    Kamis, 18 April 2019 10.47

Jawaban

Semua Balasan

  • You cannot update a file that you are currently reading.  Send the output to a new file and then delete the old file and rename.


    \_(ツ)_/

    Kamis, 18 April 2019 12.08
    Moderator
  • In addition to what JRV said, you're missing the beginning and end "'" in the assignment to the $line variable. You also have regex metacharacters in you search pattern.

    Try using the "$r" variable in the example below as the pattern in your "-match" to avoid unintentional matches (unlikely in this case, but it's still a "good thing"):

    $line = '<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">'
    $r = [RegEx]::Escape($line)


    --- Rich Matheisen MCSE&I, Exchange Ex-MVP (16 years)

    Kamis, 18 April 2019 14.45
  • $file = "C:\TempPath\ApplicationInsights.config"
    [xml]$xml = Get-Content $file
    
    $ns = $xml.DocumentElement.NamespaceURI
    $node = $xml.CreateElement('InstrumentationKey', $ns)
    $key = $xml.CreateTextNode('xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxx')
    
    $node.AppendChild($key) | Out-Null
    $xml.ApplicationInsights.PrependChild($node) | Out-Null
    
    $xml.Save($file)

    • Disarankan sebagai Jawaban oleh jrvModerator Jumat, 19 April 2019 08.23
    Jumat, 19 April 2019 07.49
  • Have you tried it?  Even if $line were properly quoted, it will add a blank line and $content to the bottom of the file for every match.  You could put parentheses around (Get-Content $fileName) so it finishes before add-content.

    • Diedit oleh JS2010 Jumat, 19 April 2019 19.56
    Jumat, 19 April 2019 19.24
  • I like this simple solution from https://stackoverflow.com/questions/1875617/insert-content-into-text-file-in-powershell

    (Get-Content $fileName) | 
        Foreach-Object {
            $_ 
            if ($_ -match $line) 
            {  
    $content
    } } | Set-Content $fileName
    • Diedit oleh JS2010 Jumat, 19 April 2019 20.35
    • Ditandai sebagai Jawaban oleh Shane W Selasa, 23 April 2019 09.10
    Jumat, 19 April 2019 19.51