是否存在 PowerShell Escape 函数可以将控制字符(例如回车符)替换为 特殊 PowerShell 字符?
(类似于
Regex.Escape(String) Method
用于转义特殊 regex 字符)`u{x}
)
使用正则表达式回调:
$Backtick = @{}
foreach ($Char in '0abefnrtv`'.ToCharArray()) {
$Backtick[$ExecutionContext.InvokeCommand.ExpandString("``$Char")] = "``$Char"
}
$SpecialCharacters = '[' + (-Join $Backtick.get_Keys()) + ']'
function Escape($Text) {
[regex]::Replace($Text, $SpecialCharacters, { param($Match) $Backtick[$Match.Value] })
}
Escape 'Test
123'
Test`n123
提供基于
Debug-String
函数的预打包解决方案,可作为 MIT 许可的 Gist:
假设您已查看链接的代码以确保其安全(我个人可以向您保证,但您应该始终检查),您可以直接安装它,如下所示:
irm https://gist.github.com/mklement0/7f2f1e13ac9c2afaf0a0906d08b392d1/raw/Debug-String.ps1 | iex
Debug-String
的主要目的是可视化字符串中的(隐藏)控制字符和空格(请参阅这个答案),但它还提供了-AsSourceCode
和-SingleLine
开关,可以产生所需的结果单行、控制字符作为转义序列字符串表示形式(尽管是 with 封闭的 "
字符,但您可以使用 .Trim('"')
轻松修剪它们。
此外,您可以使用
-UnicodeEscapes
来通过 Unicode 转义序列(例如 é
)表示非 ASCII 范围字符(例如 `u{e9}
),但请注意,此类转义仅在 PowerShell 中被识别(核心)v6+。
Debug-String -AsSourceCode -SingleLine -UnicodeEscapes 'Tést`1
123'
上面的结果(逐字,包括
"
字符。),可以将其复制并粘贴到PowerShell代码中以扩展为原始字符串:
"T`u{e9}st``1`n123"
不如您的代码,但这是另一种方法:
function Escape([string]$Text) {
if (![string]::IsNullOrWhiteSpace($Text)) {
$special = 0,7,8,9,10,11,12,13,27,96 | ForEach-Object { [char]$_ }
$escaped = '`0', '`a', '`b', '`t', '`n', '`v', '`f', '`r', '`e', '`'
0..($special.Count -1) | ForEach-Object { $Text = $Text -replace $special[$_], $escaped[$_] }
}
$Text
}
Escape 'Test
123'
# --> Test`r`n123
为了构建 iRon 的答案,如果 powershell 版本低于 6,此版本会排除“e”。(它还将变量放入函数内部,因为我使用它的代码处理返回的全局变量的名称由
Get-Variable
。)
function PSEscape($Text) {
$Backtick = @{}
foreach ($Char in ((@('','e')[$PSVersionTable.PSVersion.Major -ge 6])+'0abfnrtv`').ToCharArray()) {
$Backtick[$ExecutionContext.InvokeCommand.ExpandString("``$Char")] = "``$Char"
}
$SpecialCharacters = '[' + (-Join $Backtick.get_Keys()) + ']'
[regex]::Replace($Text, $SpecialCharacters, { param($Match) $Backtick[$Match.Value] })
}