是否存在用于特殊字符的 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"
与自我回答一样,我希望能够从文本中删除控制字符以获得单行字符串。
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('"')
.
此外,您可以使用 -UnicodeEscapes
以通过其 Unicode 转义序列(例如`u{e9}
),但请注意此类转义仅在 PowerShell (Core) v6+.
Debug-String -AsSourceCode -SingleLine -UnicodeEscapes 'Tést`1
123'
上面的结果(逐字地,包括 "
个字符。),可以将其复制并粘贴到 PowerShell 代码中以扩展为原始字符串:
"T`u{e9}st``1`n123"