У меня странная проблема, когда мне нужно удалить "пустые символы", которые, вероятно, не являются пробелами или табуляциями.
Это информация из 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 у меня естьКонечные нули SIX, которые точно соответствуют концевым пробелам SIX в моей строке результата ....
Поэтому я попробовал другой метод для преобразования массива:
$SERIAL2 = ($SERIAL -notmatch 0 | ForEach{[char]$_}) -join ""
"+$SERIAL2+"
Это работаетудалить пробелы, однако это неприемлемо, потому что портит сериал следующим образом:
+HVLQB054+
Что должно быть: +HVLQB02542+
Что я здесь не так делаю?Это странно, потому что, если я специально прошу заменить пробелы SIX, это тоже не сработает.Вот почему я подозреваю, что эти "пробелы" на самом деле не являются пробелами!
Пока я заставляю его работать с помощью RegEx, который удаляет все, что не является буквой или цифрой:
$FINAL = $SERIAL_AS_STRING -replace "[^A-Za-z0-9]"
Но как это можно сделать правильно, так как это похоже на временное решение?
РЕДАКТИРОВАТЬ: С помощью пользователя TrebleCode ниже, я смог идентифицировать оскорбительные символы как код Ascii0 символов, как это [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, который является пробелом.