Что действительно делает параметр переключателя -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 также поставляется с поставщиком накопителя реестра, который позволяет управлять реестром, как если бы это был накопитель.
- Это не только бесполезно, но и активно вводит в заблуждение, поскольку поставщик файловой системы PowerShell явно установлен вместе с PowerShell и поддерживает
-Online
переключиться наGet-Help
удобно позволяет открывать онлайн-версию запрашиваемой темы в браузере; так что давайте попробуем это (Get-Help Get-Content -Online
):Windows PowerShell v5.1: содержит страницу 404 (!), Связанную с v4.
PowerShell Core v6.0.1: открывает ту же общую тему, что и поиск в Google.
Однако есть надежда: вышеупомянутая страница 404 предлагает ссылку на тему, относящуюся к провайдеру файловой системы: Get-Content for FileSystem
Именно там мы наконец-то открыли онлайн-версию действительно релевантной информации о конкретном поставщике, которая Get-Help Get-Content -Parameter Raw
обеспечивает локально, но - как указано - только в Windows PowerShell.