Powershell: Find/Replace pattern of ASCII control characters
This expression:
@("[char]3 [char]0 [char]2 [char]3 [char]1")
...creates an array with a single element. You need commas between terms if you really want an array of 5 items, but -replace
does not support arrays anyway. Also, your single element contains the literal characters you typed; not what you expected.
What you need is to create a simple string to feed to -replace
; this is a bit more involved when you are dealing with non-printable characters. You had the right idea--you just have to tell PowerShell to interpolate the code expressions within your string using the $()
notation on each expression:
$CR = "$([char]3)$([char]0)$([char]2)$([char]3)$([char]1)"
Michael Sorens' helpful answer explains the problem with your approach well and offers a working solution.
To offer a simpler alternative:
$CR = ([char[]] (3, 0, 2, 3, 1)) -join ''
3, 0, 2, 3, 1
creates an array of integers with the Unicode code points of the characters to create.Cast
[char[]]
converts the code points to actual characters ([char]
).-join ''
joins the array of characters (with no separator) to for a single string.
I have a function in a script that does something like this. Not sure if this will help you:
# This function will make a new file that has custom comments# it will comment out "rollback tran"# it will uncomment out "--commit tran"function CommentAndUncomment($TheScript){ PrintTextAndTime("About to run this SQL file: $TheScript") PrintTextAndTime("Will comment out 'rollback tran' and uncomment '--commit tran'") $content = Get-Content $TheScript $content | ForEach-Object { if ($_ -clike "*ROLLBACK TRAN;*") { $_ -replace "ROLLBACK TRAN;", "--ROLLBACK TRAN;" } elseif ($_ -clike "*--COMMIT TRAN;*") { $_ -replace "--COMMIT TRAN;", "COMMIT TRAN;" } else{ $_ } } | Set-Content $ModifiedCommentsFile echo $ModifiedCommentsFile sqlcmd -i $ModifiedCommentsFile del $ModifiedCommentsFile}