Показать шестнадцатеричные значения вывода Powershell функции GetInvalidFileNameChars () - PullRequest
2 голосов
/ 21 сентября 2019

В Windows 7 с PowerShell v. 2 я пытаюсь просмотреть список недопустимых символов, используя [System.IO.Path]::GetInvalidFileNameChars().

При вводе в приглашении в нем отображаются символы, по одному в строке.Я хотел бы получить их шестнадцатеричный (или десятичный) код.

Амон, что я пробовал:

  • ForEach ($char in [System.IO.Path]::GetInvalidFileNameChars()) {"{0:x}" -f $char}: выводит символы, а не шестнадцатеричные.
  • [System.IO.Path]::GetInvalidFileNameChars() | { $_.ToString("X2") }

Выражения допускаются только в качестве первого элемента конвейера.

  • [System.IO.Path]::GetInvalidFileNameChars() | Format-Hex -Raw -Encoding Ascii

Термин «шестнадцатеричный формат» не распознается ...

  • ForEach ($c in [System.IO.Path]::GetInvalidFileNameChars()) {echo $c.ToString("X2")}

Не удается найти перегрузку для«ToString» и количество аргументов: «1».

  • и т. Д.

Я знаком с Bash, Perl и даже с хромой cmd.exe, но, к сожалению, понятия не имею о PowerShell.

Но я уверен, что должен быть простой и легкий способ перечислить шестнадцатеричные значения этих символов.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2019

Помимо пропуска foreach, GetInvalidFileNameChars () выводит char,

[System.IO.Path]::GetInvalidFileNameChars() | foreach { $_.gettype() }

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Char                                     System.ValueType
True     True     Char                                     System.ValueType

, и этот метод tostring ('x2') предназначен для целых чисел (или байтов).

(1).tostring('x2')
01

Вы можете получить определения, оставив скобки.Второй - тот, который вы пытаетесь запустить.

(1).tostring

OverloadDefinitions
-------------------
string ToString()
string ToString(string format)
string ToString(System.IFormatProvider provider)
string ToString(string format, System.IFormatProvider provider)
string IConvertible.ToString(System.IFormatProvider provider)
string IFormattable.ToString(string format, System.IFormatProvider formatProvider)

Итак (поскольку .tostring имеет более высокий приоритет, чем [int], нам нужны дополнительные скобки) (я в osx, так что естьтолько 2 результата.)

[System.IO.Path]::GetInvalidFileNameChars() | foreach { ([int]$_).tostring('x2') }
00
2f

Если вам нужен format-hex, обновите ваш powershell.

То же самое с последним.Этот метод предназначен для целых чисел:

ForEach ($c in [System.IO.Path]::GetInvalidFileNameChars()) { 
  echo ([int]$c).ToString("X2") }

Int32.ToString метод: https://docs.microsoft.com/en-us/dotnet/api/system.int32.tostring?view=netframework-4.8#System_Int32_ToString_System_String_

3 голосов
/ 21 сентября 2019

Попробуйте

[System.IO.Path]::GetInvalidFileNameChars() | ForEach-Object {'{0:X2}' -f [int]$_ }
0 голосов
/ 22 сентября 2019

Мне хотелось бы получить их шестнадцатеричный (или десятичный) код.

Поскольку [System.IO.Path]::GetInvalidFileNameChars() возвращает [char[]] (массив ([]) из [char] экземпляров)), вы можете напрямую преобразовать этот массив в [int[]], чтобы получить кодовые точки Unicode кодовых единиц UTF-16, которые представляют экземпляры .NET [char];по умолчанию они отображаются как десятичные числа :

PS> [int[]] [System.IO.Path]::GetInvalidFileNameChars()

34
60
62
124
0
...

для получения шестнадцатеричных чисел (в виде строк) ,передать в ForEach-Object и отформатировать каждое число с помощью строки форматирования, переданной в -f, оператор форматирования строки PowerShell;например, чтобы отформатировать каждую кодовую точку как 0x с префиксом hex.число, которое 0 дополняется слева до 2 цифр (синтаксис PSv4 +; в PSv3- вместо «*» 1030 *, как в полезный ответ Тео , который будет медленнее):

PS> [System.IO.Path]::GetInvalidFileNameChars().ForEach({ '0x{0:x2}' -f [int] $_ })

0x22
0x3c
0x3e
0x7c
0x00
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...