Что действительно делает параметр переключателя -raw в Get-Content в Powershell? Поиск полезной документации

Я пытался работать с API, который принимает только необработанный текст или закодированные в base64 значения в объекте JSON. Содержимое, которое я размещаю, представляет собой данные из файла XML. Так что я использовал Powershell's Get-Content командлет (без -Raw) получить данные из XML-файла, затем закодировать их в base64 и отправить в API. Затем API декодирует его, но форматирование XML было потеряно.

Я нашел так пост об использовании -Raw включить Get-Content, но кажется, что документация для этого переключателя расплывчата. Когда я использовал -Raw переключил, закодировал и отправил обратно в API, форматирование прошло хорошо.

2 ответа

Решение

Согласно комментарию Кори Гилла и вашему собственному, встроенный Get-Help и документация MSDN должна быть вашим первым портом захода. Но вы уже RTFM!

Когда это не удается, ss64 является отличным справочным материалом для документации Powershell и дополнительных примеров.

Страница Get-Content здесь. Это есть, что сказать о -Raw:

Возврат нескольких строк в виде одной строки (PowerShell 3.0)
В PowerShell 2.0 используйте статический метод: [System.IO.File]::ReadAllText(путь строки)

briantist комментарий briantist по этому вопросу кратко резюмирует ответ (по его словам; слегка отредактировано, акцент добавлен):

Get-Content [по умолчанию] читает файл построчно и возвращает массив строк. С помощью -Raw Читает все содержимое файла в виде одной строки.

Имя -Raw немного неудачно, потому что он по ошибке предлагает читать сырые байты, тогда как -Raw все еще обнаруживает кодировки и в конечном итоге читает все в.NET [string] тип.
(В отличие от -Encoding Byte (Windows PowerShell) или -AsByteStream (PowerShell Core) для чтения файла в виде байтового массива.)

Дано -Raw фактическая цель, возможно, что-то вроде -AsOne было бы лучше, но этот корабль уже прошел (хотя добавление псевдонима для параметра все еще возможно).

Давайте посмотрим, почему эту информацию в настоящее время трудно обнаружить:


Повесть о проблемах с документацией PowerShell

Центральным конфликтом этой истории является противоречие между прочной основой потенциально мощной справочной системы PowerShell и ее текущим контентом.

  • Как часто бывает, на помощь приходят третьи лица, как показано в полезном ответе gms0ulman.

  • Однако, как отмечает Бриантист, документация PowerShell теперь имеет открытый исходный код и приветствует вклады; он утверждает:
    "Я направлю ваше внимание на ссылку" Изменить " Get-Content раздел справки на GitHub] [...], чтобы вы могли исправить это и представить что-то лучшее (включая примеры). Я сделал это раньше; они принимают запросы на извлечение. "
    Предостережение заключается в том, что, хотя будущие версии PowerShell Core получат преимущества от улучшений, неясно, вернутся ли улучшения обратно в Windows PowerShell.

Давайте спросим встроенную справочную систему PowerShell, доступную через стандарт Get-Help Командлет (содержимое, для которого нельзя предварительно установить; установить при появлении запроса или запустить Update-Help от повышенного сеанса):

Get-Help Get-Content -Parameter Raw

Обратите внимание, как удобно обращаться за помощью по определенному параметру (-Parameter Raw).

В Windows PowerShell v5.1 это дает:

-Raw Игнорирует символы новой строки и возвращает все содержимое файла в одну строку. По умолчанию содержимое файла возвращается в виде массива строк, разделенных символом новой строки.

  Raw - это динамический параметр, который поставщик FileSystem добавляет в командлет Get-Content. Этот параметр работает только на дисках файловой системы. Этот параметр представлен в Windows PowerShell 3.0. Необходимые? ложная позиция?                    named Значение по умолчанию Принимать входные данные из конвейера?                    false Принять символы подстановки? ложный 

Это действительно то, что мы искали и очень помогли (оставив в стороне неуклюжую фразу "разделенный символом новой строки", а в Windows символ новой строки представляет собой последовательность символов).

На Powershell Core v6.0.2 это дает:

-raw

    Необходимые? ложный
    Позиция? названный
    Принимать входные данные из конвейера? ложный
    Имя набора параметров (Все)
    Псевдонимы Нет
    Динамический? правда

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

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

Поэтому в данном случае давайте попробуем (PowerShell Core в Windows):

Get-Help Get-Content -Parameter Raw -Path C:\

К сожалению, результат такой же бесполезный ответ, как и раньше.

Обратите внимание, что, пока вы вызываете команду из расположения файловой системы, явное использование -Path не должно быть необходимым, потому что провайдер, лежащий в основе текущего местоположения, неявно является целью.


Теперь давайте посмотрим на онлайн- версии разделов справки PowerShell:

Как оказалось, у данного командлета провайдера может быть несколько страниц документации:

  • Общий, который применяется ко всем поставщикам.

  • Специфичные для провайдера страницы, которые документируют поведение и параметры, исключающие провайдера -Raw для провайдера файловой системы.

К сожалению, в общих темах ничего не говорится о существовании провайдеров, что затрудняет их обнаружение.

  • погуглить Get-Content Перенесет вас в https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content - общую тему, которая содержит следующее вводящее в заблуждение утверждение: This parameter is not supported by any providers that are installed with Windows PowerShell.

    • Это не только бесполезно, но и активно вводит в заблуждение, поскольку поставщик файловой системы PowerShell явно установлен вместе с PowerShell и поддерживает -Raw,
      Поставщики [Drive] представляют собой обобщение PowerShell метафоры дисков файловой системы для поддержки нацеливания на другие [обычно иерархические] системы хранения с унифицированным набором командлетов. Например, Windows PowerShell также поставляется с поставщиком накопителя реестра, который позволяет управлять реестром, как если бы это был накопитель.
  • -Online переключиться на Get-Help удобно позволяет открывать онлайн-версию запрашиваемой темы в браузере; так что давайте попробуем это (Get-Help Get-Content -Online):

Однако есть надежда: вышеупомянутая страница 404 предлагает ссылку на тему, относящуюся к провайдеру файловой системы: Get-Content for FileSystem

Именно там мы наконец-то открыли онлайн-версию действительно релевантной информации о конкретном поставщике, которая Get-Help Get-Content -Parameter Raw обеспечивает локально, но - как указано - только в Windows PowerShell.

Другие вопросы по тегам