เรียกใช้-RestMethod OutFile ว่างเปล่าเมื่อใช้ PassThru

การใช้ PowerShell 4.0 และ Invivo-RestMethod cmdlet ฉันมีปัญหากับตัวเลือก -OutFile และ -PassThru เมื่อใดก็ตามที่ฉันเพิ่มตัวเลือก -PassThru ไฟล์ -OutFile ของฉันจะถูกสร้างขึ้นแต่เนื้อหาว่างเปล่า!

ตามเอกสารประกอบ Invivo-RestMethod ทั้งไฟล์เอาท์พุตและอ็อบเจ็กต์ไปป์ไลน์ควรจะพร้อมใช้งานเมื่อใช้ตัวเลือกเหล่านี้ร่วมกัน "-OutFile บันทึกเนื้อหาการตอบสนองในไฟล์เอาต์พุตที่ระบุ [...] หากต้องการส่งผลลัพธ์ไปยังไฟล์และไปป์ไลน์ ให้ใช้พารามิเตอร์ Passthru"

นี่คือ การทดสอบเพื่อทำซ้ำปัญหาที่ฉันมี ที่นี่ฉันกำลังเรียก 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

ต่อไปนี้เป็นการทดสอบสองรายการเพื่อตรวจสอบการทำงานปกติของ Invivo-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)

ฉันคิดว่าการทดสอบเหล่านี้ควรช่วยให้ผู้อื่นเห็นปัญหาที่ฉันมี คำถามของฉันคือ มีบางอย่างที่ฉันขาดหายไปในการทำงานนี้หรือไม่ หรือนี่อาจเป็นข้อบกพร่องของ cmdlet หรือไม่ ฉันใช้ Google เล็กน้อยเพื่อหาวิธีแก้ปัญหาและไม่มีรายงานที่ชัดเจนเกี่ยวกับปัญหานี้ ฉันต้องการใช้ -OutFile เป็นส่วนหนึ่งของวิธีแก้ปัญหาสำหรับปัญหา Invivo-RestMethod อื่นที่เกี่ยวข้องกับการเข้ารหัสเนื้อหาตามที่อธิบายไว้ที่ ข้อผิดพลาด? เรียกใช้ข้อมูล 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 โดยตรง เรียกใช้-RestMethod cmdlet   -  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 เช่นกัน และ Intake-WebRequest สามารถทำ -Outfile และ -PassThru ร่วมกันได้ แต่ Inrigg-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 และยูนิโค้ดผ่านมาตกลง หาก REST ของคุณบอกว่า utf8...   -  person TessellatingHeckler    schedule 25.03.2017
comment
ขอบคุณ @TessellatingHeckler นั่นเป็นอีกปัญหาหนึ่งที่ฉันมี ไม่รองรับการเข้าถึงส่วนหัวการตอบกลับด้วย Inrigg-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