Powershell: Find/Replace pattern of ASCII control characters

后端 未结 3 1043
长发绾君心
长发绾君心 2021-01-12 15:52

I\'m trying to write a script to search the contents of a file, and when it comes across a grouping of ASCII control characters, to insert a CR/LF.

The pattern of ch

相关标签:
3条回答
  • 2021-01-12 16:05

    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)"
    
    0 讨论(0)
  • 2021-01-12 16:12

    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.

    0 讨论(0)
  • 2021-01-12 16:24

    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
    }
    
    0 讨论(0)
提交回复
热议问题