Неожиданное поведение со строкой, хранящейся в переменной в PowerShell - PullRequest
0 голосов
/ 04 октября 2018

Я получаю странное поведение от метода Cells.Find() в Excel:

Переменная, которую я ищу:

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 Ответ

0 голосов
/ 04 октября 2018

Следующий фрагмент можно использовать для проверки строки на наличие скрытых управляющих символов :

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, NO-BREAK SPACE (U+00A0) , который .TrimEnd() также удаляет, как указывает Tom Blodget .


Простая функция-оболочка на основе вышеизложенного для использования с входом конвейера:

filter debug-Chars { [int[]] [char[]] $_ | % { '0x{0:x} [{1}]' -f $_, [char] $_ } }

Пример использования:

"vol_01`n" | debug-Chars
...