我遇到了一个奇怪的问题,我需要删除可能不是空格或制表符的“空白字符”。
这是来自 WMI 的信息。“SerialNumberID”属性存储为 UInt16[] 数组。
我像这样收集它:
$SERIAL = (Get-WmiObject -ComputerName XXXX WmiMonitorID -Namespace root\wmi ).SerialNumberID
这现在包含以下数组:
72
86
76
81
66
48
50
53
52
50
0
0
0
0
0
0
要将其转换为可读格式,我正在做:
$SERIAL_AS_STRING = [System.Text.Encoding]::Default.GetString($SERIAL)
"+$SERIAL_AS_STRING+"
(我使用 + 字符来轻松识别数据后是否有字符)
这返回:
+HVLQB02542 +
我只想拥有序列号,所以我试图摆脱这样的空格:
$SERIAL_AS_STRING = $SERIAL_AS_STRING.Trim()
"+$SERIAL_AS_STRING+"
它仍然返回空格!:
+HVLQB02542 +
即使我尝试类似:
$SERIAL_AS_STRING = $SERIAL_AS_STRING -replace '(^\s+|\s+$)','' -replace '\s+',' '
空间总是在那里。
现在我看到在 System.UInt16 数组中我有六个尾随零,它与我的结果字符串中的六个尾随空格完全吻合......
所以我尝试了一种不同的方法来转换数组:
$SERIAL2 = ($SERIAL -notmatch 0 | ForEach{[char]$_}) -join ""
"+$SERIAL2+"
这可以删除尾随空格,但这是不可接受的,因为它会像这样弄乱序列:
+HVLQB054+
应该是:+HVLQB02542+
我在这里做错了什么?这很奇怪,因为如果我特别要求替换六个空格,它也不起作用。这就是为什么我怀疑这些“空格”不是真正的空格字符!
现在我通过使用 RegEx 使它工作,它删除了任何不是字母或数字的东西:
$FINAL = $SERIAL_AS_STRING -replace "[^A-Za-z0-9]"
但是如何才能正确地完成它,因为这感觉像是一种变通解决方案?
编辑:在下面用户 TrebleCode 的帮助下,我能够将违规字符识别为 Ascii 代码 0 字符,如下所示[byte][char]$SERIAL_AS_STRING[16]
。这返回了 0,所以现在我知道我必须用任何内容替换 Ascii 代码 0。
这是我解决它的方法:
$ascii0 = [char]0
$FinalString = $SERIAL_AS_STRING -replace $ascii0,""
"+$FinalString+"
+HVLQB02542+
啊,没有更多的垃圾空白字符 :) ASCII 代码 0 实际上是 0 NUL(Null),而代码 32 是空格。