Invoke-RestMethod OutFile пуст при использовании PassThru

Использование PowerShell 4.0 и командлета Invoke-RestMethod. У меня проблемы с параметрами -OutFile и -PassThru. Каждый раз, когда я добавляю параметр -PassThru, создается мой -OutFile, но его содержимое остается пустым!

Согласно документации Invoke-RestMethod, при совместном использовании этих параметров должны быть доступны как выходной файл, так и объект конвейера. "-OutFile Сохраняет тело ответа в указанном выходном файле. [...] Чтобы отправить результаты в файл и в конвейер, используйте параметр Passthru."

Вот тест, чтобы повторить возникшую у меня проблему. Здесь я вызываю rest api, пытаясь ОБА сохранить ответ в файл И десериализовать его в объект PowerShell.

"POWERSHELL VERSION $($host.Version.ToString())"
$date = Invoke-RestMethod "http://date.jsontest.com" -OutFile "OutFile.txt" -PassThru
Get-Content "OutFile.txt"
# FILE IS EMPTY!!! PASSTHRU SEEMS TO RESULT IN EMPTY FILE
$date
# powershell object has the date received from api

Вот два теста для проверки нормальной работы Invoke-RestMethod БЕЗ параметра PassThru.

# ... Test # 1, call rest api and deserialize into powershell object
$date = Invoke-RestMethod "http://date.jsontest.com"
$date
# Output shows the date retrieved from sample restful service
# ... Test # 2, call rest api and save response body directly to a file
Invoke-RestMethod "http://date.jsontest.com" -OutFile "OutFile.txt"
Get-Content "OutFile.txt"
# Output shows contents of rest api response body (json text)

Я думаю, что эти тесты должны помочь другим увидеть мою проблему. Мой вопрос: есть ли что-то, что мне не хватает для выполнения этой работы, или это может быть ошибка командлета? Я немного искал решение в Google, но никаких очевидных сообщений об этой проблеме нет. Я хочу использовать -OutFile как часть обходного пути для другой проблемы Invoke-RestMethod, связанной с кодированием контента, как описано на Ошибка? Данные Invoke-RestMethod и UTF-8. Параметр -PassThru полезен для меня, чтобы просмотреть возвращенные данные и завершить итерацию для набора результатов odata с несколькими запросами (с разбивкой на страницы).


person Mister_Tom    schedule 24.03.2017    source источник
comment
Вы могли Tee-Object   -  person BenH    schedule 25.03.2017
comment
Спасибо @BenH, к сожалению, сейчас я использую что-то вроде Tee, но есть ошибка кодировки символов, которую я пытаюсь устранить, которая, похоже, имеет обходной путь, требующий использования -OutFile непосредственно на Командлет Invoke-RestMethod.   -  person Mister_Tom    schedule 25.03.2017
comment
Invoke-RestMethod является оболочкой Invoke-WebRequest, происходящей от WebRequestPSCmdlet. В этом коде есть переменные с именем ShouldSaveToOutFile, которые проверяют, указали ли вы имя файла, и ShouldWriteToPipeline как (!ShouldSaveToOutFile || PassThru). Похоже, он должен работать так, как вы думаете. Файл, если вы его назвали, иначе конвейер. И то, и другое, если вы использовали Outfile и passthru.   -  person TessellatingHeckler    schedule 25.03.2017
comment
И выходной код имеет отдельные проверки для if (ShouldWriteToPipeline) и if (ShouldSaveToOutFile). Эти ссылки предназначены для открытого исходного кода PSv6 ... так что также могла быть ошибка в версии 4 и исправлена.   -  person TessellatingHeckler    schedule 25.03.2017
comment
Я только что тестировал PowerShell 5.1 в Windows 10 - та же проблема с использованием того же теста, описанного выше. Я ценю образцы кода и анализ от @TessellatingHeckler - объявлена ​​ли дата производственного выпуска PowerShell 6.0? Я бы с удовольствием его протестировал, но, вероятно, после него выйдет RTM.   -  person Mister_Tom    schedule 25.03.2017
comment
Понятия не имею о дате для PS 6. Я только что попробовал это на Windows 10 PS 5.1, и Invoke-WebRequest может выполнять -Outfile и -PassThru вместе, а Invoke-RestMethod - нет. Странный. Что касается вашей ссылки на ошибку кодирования, я только что нашел в сети случайный REST API, который повторяет то, что вы его отправляете, и попробовал irm https://httpbin.org/get?q=1♫, и музыкальная нота вернулась в консоль. Заголовки, которые он отправляет обратно, имеют Content-Type: application/json. Другой irm http://httpbin.org/encoding/utf8 отправляет заголовок Content-Type: text/html; charset=utf-8, и Unicode приходит через OK. Если ваш REST сказал utf8 ...   -  person TessellatingHeckler    schedule 25.03.2017
comment
Спасибо @TessellatingHeckler. Это еще одна проблема, с которой я столкнулся: нет поддерживаемого доступа к заголовкам ответов с помощью Invoke-RestMethod. Похоже, я буду использовать Invoke-WebRequest для большего количества этих задач REST, чтобы я мог видеть возвращаемые заголовки и, возможно, лучше реагировать на отсутствующий или неправильный тип контента из ответов сторонних веб-служб. Я буду следить за PS 6 RTM, чтобы увидеть, исправят ли это :-).   -  person Mister_Tom    schedule 27.03.2017
comment
Похоже, это ошибка в команде. Вы можете попробовать это: Invoke-RestMethod "http://date.jsontest.com" -PassThru -OutFile .\Out2.txt | Out-File .\Out.txt   -  person SavindraSingh    schedule 09.07.2018


Ответы (1)


Я считаю, что переключатель -PassThru перенаправляет весь вывод только на консоль, и я думаю, что именно поэтому ваш файл пуст. Однако, поскольку у вас есть переменная, вы можете добавить еще одну строку, подобную этой. . .

Write-Output -InputObject $date | Out-File -FilePath "OutFile.txt"
person Vern_Anderson    schedule 29.08.2018