是否存在用于特殊字符的 PowerShell 转义函数

Does there exists a PowerShell Escape function for Special Characters

与自我回答一样,我希望能够从文本中删除控制字符以获得单行字符串。
Special PowerShell Characters 是否存在 PowerShell Escape 函数?
(类似于用于转义特殊 regex 字符的 Regex.Escape(String) Method
或者有比自我回答更聪明的方法吗?
(我不太关心Unicode转义序列:`u{x}

使用 regular expression callback:

$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

不如您的代码好,但这里有另一种方法:

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

提供基于 Debug-String 函数 的预打包解决方案,可作为 an MIT-licensed Gist:

假设你已经查看了链接代码以确保它是安全的(我个人可以向你保证,但你应该经常检查),你可以直接安装它,如下所示:

irm https://gist.github.com/mklement0/7f2f1e13ac9c2afaf0a0906d08b392d1/raw/Debug-String.ps1 | iex

Debug-String 的主要目的是可视化(隐藏)字符串中的控制字符和空格(参见 this answer),但它也提供 -AsSourceCode -SingleLine 开关,它们产生所需的单行控制字符作为转义序列字符串表示(尽管 封闭的 " 个字符。,但您可以使用 .Trim('"').

轻松 trim 它们

此外,您可以使用 -UnicodeEscapes 以通过其 Unicode 转义序列(例如`u{e9}),但请注意此类转义仅在 PowerShell (Core) v6+.

中被识别
Debug-String -AsSourceCode -SingleLine -UnicodeEscapes 'Tést`1
123'

上面的结果(逐字地,包括 " 个字符。),可以将其复制并粘贴到 PowerShell 代码中以扩展为原始字符串:

"T`u{e9}st``1`n123"