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

6

我正在尝试编写一个脚本来搜索文件内容,并在找到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个回答

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)"

干得好。小问题:-replace 不支持在 RHS 上使用数组(只支持一个 regex_);但是,_LHS - 输入字符串 - 可以是一个数组(在这种情况下,替换操作将分别在数组元素上执行)。 - mklement0

1

Michael Sorens的有益回答很好地解释了您的方法存在的问题并提供了有效的解决方案。

为了提供一个更简单的替代方案:

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

  • 强制转换 [char[]] 将码点转换为实际字符 ([char])。

  • -join '' 将字符数组 (无分隔符) 连接成单个字符串。


1
感谢 @mkelement0 的改进! - Michael Sorens

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
}

谢谢,但那并没有帮助到我。 - Jerry Sweeton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接