当使用PassThru时,Invoke-RestMethod OutFile为空。

9
使用PowerShell 4.0和Invoke-RestMethod cmdlet。我在-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

以下是两个测试,用于验证没有PassThru选项的Invoke-RestMethod的正常功能:
# ... 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的一个错误?我已经为解决方法谷歌了一下,但没有明显的问题报告。我想使用-OutFile作为另一个Invoke-RestMethod问题的解决方法,该问题涉及到内容编码,如 Bug? Invoke-RestMethod和UTF-8数据 中所述。 -PassThru选项对我查看返回的数据并终止迭代对多请求(分页)odata结果集非常有帮助。

你可以使用 Tee-Object - BenH
1
Invoke-RestMethod 包装了 Invoke-WebRequest,而 Invoke-WebRequest 派生自 WebRequestPSCmdlet该代码有一些变量,如 ShouldSaveToOutFile,它检查是否提供了文件名,以及 ShouldWriteToPipeline,其值为 (!ShouldSaveToOutFile || PassThru)。看起来它的工作方式与您想象的一样。如果指定了输出文件,则输出到文件;否则输出到管道。如果同时使用了输出文件和传递参数,则两者都会执行。 - TessellatingHeckler
1
而且输出代码有if (ShouldWriteToPipeline)if (ShouldSaveToOutFile)的单独检查。这些链接是针对PSv6开源代码的...所以在v4中可能也存在错误并已修复。 - TessellatingHeckler
1
关于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也能正常传输。如果你的REST服务支持UTF-8... - TessellatingHeckler
似乎这是命令中的一个错误。你可以尝试这个:Invoke-RestMethod "http://date.jsontest.com" -PassThru -OutFile .\Out2.txt | Out-File .\Out.txt - SavindraSingh
显示剩余3条评论
1个回答

1
我认为-PassThru开关将所有输出重定向到控制台,这就是为什么你的文件为空的原因。但是,由于你将它存储在一个变量中,你可以再添加一行代码。
Write-Output -InputObject $date | Out-File -FilePath "OutFile.txt"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接