gpt4 book ai didi

powershell - 有没有更好的方法将所有控制字符转换为PowerShell 5中的实体?

转载 作者:行者123 更新时间:2023-12-03 00:35:37 25 4
gpt4 key购买 nike

上下文:Azure,Windows Server 2012,PowerShell 5

我有以下代码将所有控制字符(除\ x20本身以外的ascii和unicode空格)转换为与&哈希对应的字符。

function ConvertTo-AmpersandHash {
param ([Parameter(Mandatory)][String]$Value)
# there's got to be a better way of doing this.
$AMPERHASH = '&#'
$SEMICOLON = ';'
for ($i = 0x0; $i -lt 0x20; $i++) {
$value = $value -replace [char]$i,($AMPERHASH + $i + $SEMICOLON)
}
for ($i = 0x7f; $i -le 0xa0; $i++) {
$value = $value -replace [char]$i,($AMPERHASH + $i + $SEMICOLON)
}
return $Value
}

从嵌入的注释可以看出,我敢肯定有更好的方法可以做到这一点。就目前而言,每个传入的字符串进行约65次迭代。正则表达式会更好/更快地工作吗?

后来
 -replace '([\x00-\x1f\x7f-\xa0])',('&#' + [byte][char]$1  + ';')

看起来很有希望,但是$ 1一直在评估为零,因此一直给我 �

以后还是

以为 -replace无法在内部进行迭代,我想到了
$t = [char]0 + [char]1 + [char]2 + [char]3 + [char]4 + [char]5 + [char]6
$r = '([\x00-\x1f\x7f-\xa0])'
while ($t -match [regex]$r) {
$t = $t -replace [regex]$r, ('&#' + [byte][char]$1 + ';')
}
echo $t

但是我仍然得到
�������

最后
function ConvertTo-AmpersandHash {
param ([Parameter(Mandatory)][String]$Value)
$AMPERHASH = '&#'
$SEMICOLON = ';'
$patt = '([\x00-\x1f\x7f-\xa0]{1})'
while ($Value -match [regex]$patt) {
$Value = $Value -replace $Matches[0], ($AMPERHASH + [byte][char]$Matches[0] + $SEMICOLON)
}
return $Value
}

效果更好。也更快。有什么进展吗?

最佳答案

Kory Gill对库调用的回答肯定是更好的方法,但是要解决您的正则表达式问题,您不能使用-replace运算符评估替换中的代码。

为此,您需要使用.Net regex replace method,并向其传递一个脚本块来评估替换,该替换使用匹配参数。例如

PS C:\> [regex]::Replace([string][char]2,
'([\x00-\x20\x7f-\xa0])',
{param([string]$m) '&#' + [byte][char]$m + ';'})


关于powershell - 有没有更好的方法将所有控制字符转换为PowerShell 5中的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41032973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com