Неожиданное поведение со строкой, хранящейся в переменной в PowerShell
Я получаю странное поведение от Excel Cells.Find()
метод:
Переменная, которую я ищу:
PS > $volumename
vol_01
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
не дает результатов:
PS > $sheet.Cells.Find($volumename).Row
но если я вручную скопирую и вставлю значение этой переменной:
PS > $volumename = "vol_01"
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Получает ожидаемое значение:
PS > $sheet.Cells.Find($volumename).Row
198
Они кажутся мне абсолютно одинаковыми во всех отношениях. Это не случается для каждого случая. Некоторые имена томов хорошо проходят, а другие нет. Я очистил имя тома для этого поста, так как он имеет соглашение об именах клиентов. Это тот же формат, что и выше, и тот же формат, что и для имен томов, которые работают.
1 ответ
Следующий фрагмент можно использовать для проверки строки на наличие скрытых управляющих символов:
PS> & { [int[]] [char[]] $Args[0] | % { '0x{0:x} [{1}]' -f $_, [char] $_ } } "vol_01`n"
0x76 [v]
0x6f [o]
0x6c [l]
0x5f [_]
0x30 [0]
0x31 [1]
0xa [
]
Первый столбец - это кодовая точка Unicode каждого символа ("код ASCII"), а второй столбец - сам символ, заключенный в [...]
Обратите внимание, что я добавил "`n"
в конце строки - символ новой строки ( U+000A
) - чья кодовая точка выражена в виде шестнадцатеричного числа. номер 0xa
,
Если, как и в вашем случае, единственной нежелательной частью строки является конечный пробел, вы можете удалить их следующим образом:
$volumename.TrimEnd() # trim trailing whitespace
В вашем случае конечный пробел 0xa0
, ПРОРЫВ U+00A0
), который .TrimEnd()
также удаляет, как указывает Tom Blodget.
Простая функция-обертка, основанная на вышеупомянутом, для использования с конвейерным вводом:
filter debug-Chars { [int[]] [char[]] $_ | % { '0x{0:x} [{1}]' -f $_, [char] $_ } }
Образец использования:
"vol_01`n" | debug-Chars