如何解决是否存在特殊字符的 PowerShell 转义功能
与自我回答一样,我希望能够从文本中删除控制字符以获得单行字符串。
Special PowerShell Characters 是否存在 PowerShell 转义函数?
(类似于用于转义特殊 regex 字符的 Regex.Escape(String) Method
)
或者有没有比自我回答更聪明的方法?
(我不太关心 Unicode 转义序列:`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
,
不如您的代码好,但这是另一种方法:
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
开关,它们产生所需的单行、控制字符作为转义序列的字符串表示(尽管带有封闭的 {{1} } 字符,但您可以使用 "
轻松修剪它们。
此外,您可以使用 .Trim('"')
来表示非 ASCII 范围字符(例如 -UnicodeEscapes
)的 Unicode 转义序列(例如 é
),但请注意,此类转义仅在 PowerShell (Core) v6+ 中被识别。
`u{e9}
以上产生(逐字逐句,包括 Debug-String -AsSourceCode -SingleLine -UnicodeEscapes 'Tést`1
123'
个字符。),可以将其复制并粘贴到 PowerShell 代码中以展开为原始字符串:
"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。