Powershell:查找/替换ASCII控制字符的模式

时间:2013-03-11 16:17:39

标签: powershell scripting ascii control-characters

我正在尝试编写一个脚本来搜索文件的内容,当遇到一组ASCII控制字符时,插入一个CR / LF。

我想替换的字符模式是 [ETX] [NUL] [STX] [ETX] [SOH]

    $filenames = @(Get-Childitem "E:\VendorFiles\*")

    $CR = @("[char]3 [char]0 [char]2 [char]3 [char]1")
    foreach ($file in $filenames) {$outfile = "$file" + ".txt"
    Get-Content $file | Foreach-object {
            $_ -replace $CR,"`r`n" `
             -replace [char]3,"|" `
             -replace [char]1,"{" `
             -replace "\\","\\" `
        } | Set-Content -encoding "UTF8" $outfile}

3 个答案:

答案 0 :(得分:6)

这个表达式:

@("[char]3 [char]0 [char]2 [char]3 [char]1")

...使用单个元素创建数组。如果你真的想要一个包含5个项目的数组,那么你需要在术语之间使用逗号,但-replace无论如何都不支持数组。此外,您的单个元素包含您键入的文字字符;不是你所期望的。

您需要创建一个简单的字符串以提供给-replace;当您处理不可打印的字符时,这会更复杂一些。你有正确的想法 - 你只需告诉PowerShell在每个表达式上使用$()表示法在字符串中插入代码表达式:

$CR = "$([char]3)$([char]0)$([char]2)$([char]3)$([char]1)"

答案 1 :(得分:1)

Michael Sorens' helpful answer很好地解释了您的方法存在的问题并提供了可行的解决方案。

提供更简单的替代方案:

$CR = ([char[]] (3, 0, 2, 3, 1)) -join ''
  • 3, 0, 2, 3, 1使用要创建的字符的Unicode代码点创建一个整数数组。

  • 广告[char[]]将代码点转换为实际字符([char])。

  • -join ''将字符数组(没有分隔符)连接到单个字符串

答案 2 :(得分:0)

我在脚本中有一个函数可以做这样的事情。不确定这是否会对您有所帮助:

# 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
}