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"
    获取内容 $file | Foreach 对象 {
            $_ -替换 $CR,"`r`n" `
             -替换 [char]3,"|" `
             -替换 [char]1,"{" `
             -替换“\\”,“\\” `
        } | 设置内容-编码“UTF8”$outfile}
4

3 回答 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)"
于 2013-03-13T18:52:24.247 回答
1

Michael Sorens 的有用回答很好地解释了您的方法存在的问题,并提供了一个可行的解决方案。

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

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

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

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

于 2017-07-27T16:10:52.290 回答
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
}
于 2013-03-11T16:55:55.847 回答