是否存在特殊字符的PowerShell转义功能

问题描述 投票:0回答:4

是否存在 PowerShell Escape 函数可以将控制字符(例如回车符)替换为 特殊 PowerShell 字符
(类似于

Regex.Escape(String) Method
用于转义特殊 regex 字符)
或者有比自我回答更聪明的方法吗?
(我不太关心 Unicode 转义序列:
`u{x}

powershell escaping special-characters
4个回答
3
投票

使用正则表达式回调:

$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

2
投票

提供基于

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"

2
投票

不如您的代码,但这是另一种方法:

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

0
投票

为了构建 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] })
}
© www.soinside.com 2019 - 2024. All rights reserved.