Search code examples
stringpowershellcharacter-encodingnewlinepowershell-4.0

String variable acting strange when writing to text file


Below is the code I am having trouble with. It pulls from a config.txt file and sets information to childofRoot.properties file. for some reason the string when I set it is coming with extra added on.

$date = (Get-Date -Format "MM-dd-yyyy'_'HH-mm")
$backup = 'backuplocation'
$temp = 'replace'
$p = ($PSScriptRoot + 'childofRoot.properties')


$cuidConf = Get-Content -Path ($PSScriptRoot + 'config.txt') | Select-String "cuids_rootfolder=" | Out-String
$cuidConf = $cuidConf.replace("cuids_rootfolder=", "").replace("`n", "")
$cuids = $cuidConf.Split(";")

$backuppath = ((Get-Content -Path ($PSScriptRoot + 'config.txt'))) | Select-String "backuplocation=" | Out-String
$backuppath = $backuppath.replace("backuplocation=", "").replace("`n", "")
$backuppath = $backuppath + $date + "\"


$foldername, $cuid = ($cuids[0].Split(","))

$backup1 = ($backuppath + "Folder a.lcmbiar")
        


((Get-content -Path $p).replace($temp, $cuid)) | Set-Content -Path $p

((Get-content -Path $p).replace($backup, $backup1)) | Set-Content -Path $p

Contents of config.txt:

backuplocation=C:\backuplcm\backupfiles\

Content of childofRoot.properties:

exportLocation=backuplocation

Expected output written to childofRoot.properties:

exportLocation=C:\backuplcm\backupfiles\08-18-2020_17-59\Folder\a.lcmbiar

Output I'm seeing written to childofRoot.properties:

exportLocation=
C:\backuplcm\backupfiles\


08-18-2020_18-02\Folder a.lcmbiar

Yes I already tried removing new line characters with .replace("`n","") I had others look at this script too and the variable looks fine just when i set it it comes out different in the text file. I was able to replicate this on Powershell 4 and Powershell 5 on different machines. If someone would try this on their machine and see if they can fix the problem.


Solution

  • The extra line breaks are from doing | Select-String "backuplocation=" | Out-String, and the reason .Replace("`n", "") doesn't solve the problem is that Windows uses the sequence "`r`n" for line breaks.

    I suggest simplifying your script with Where-Object instead of Select-String | Out-String:

    $backuppath = Get-Content -Path (Join-Path $PSScriptRoot config.txt) | Where-Object {$_ -match "backuplocation="}
    $backuppath = $backuppath -replace 'backuplocation='