我正在尝试编写一个脚本来搜索文件的内容,当遇到一组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}
答案 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
}