以下是我的Powershell环境(通过Get-Host命令):
Name : Windows PowerShell ISE Host
Version : 5.1.15063.608
InstanceId : 46c51405-fc6d-4e36-a2ae-09dbd4069710
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.Host.ISE.ISEOptions
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
我有一个脚本向资源发出REST请求 - 一切正常。
在测试时,我将URL更改为无效,以查看是否将错误消息写入输出文件 - 这是我感到困惑的地方。看来,写日志的唯一方法是使用Write-Host。当我使用Write-Output时,异常消息永远不会写入日志文件。以下是我正在使用的代码:
function rest_request( $method, $uri )
{
# Code here create @req dictionary
try {
$json = Invoke-RestMethod @req
} catch {
# If using Write-Output - Nothing is written to output file???
# MUST use Write-Host for error info to be included in output file - WHY?
Write-Host "* REST Request Error:"
Write-Host $error[0] | Format-List -force
$json = $null
}
return $json
}
function do_something()
{
Write-Output "Start..."
# other functions called here but removed for clarity.
# The other functions contain Write-Output statements
# which are showing in the log file.
# Issue REST request with invalid URL to cause exception ...
$json = rest_request "Get" "https://nowhere.com/rest/api"
Write-Output "Done."
}
do_something | Out-File "D:\temp\log_file.txt" -Append
根据这篇博文:using Write-Host should be avoided,然而,似乎Write-Host是我在输出文件中获取错误消息的唯一方法。
我的问题是:如何编写一个发出REST请求的函数并在成功时返回结果,但如果发生错误,请将错误消息写入输出文件并返回$ null?
因为我在PowerShell方面相当环保,所以我们不胜感激。
答案 0 :(得分:1)
好的 - 我完全放弃了重定向,而是编写了一个将参数写入日志文件的函数,如下所示:
function log_write
{
param
(
[Parameter(ValueFromPipeline=$true)] $piped
)
$piped | Out-File $log_file -Append
}
注意:$ log_file在初始化时设置,因为我需要一周中每天的新日志文件名。
然后,我用log_write替换了所有写输出/写主机,即:
log_write "* REST Request Error:"
$s = $error[0] | Format-List -force
log_write $s
像魅力和例外消息一样工作,写入日志文件而没有任何先前的问题。
答案 1 :(得分:0)
据我所知Write-Host
只写主机,没有别的。
在您的示例中,do_something
不返回任何内容,因此您不会在日志文件中获得任何内容。
以下是如何做到这一点,但存在许多不同的方法:
function Send-RESTRequest {
Param($method, $uri, $logFile)
# Code here create @req dictionary
try {
# make sure exception will be caught
$json = Invoke-RestMethod @req -ErrorAction Stop
} catch {
# send exception details to log file
$_ | Out-File $logFile -Append
$json = $null
}
return $json
}
function Do-Something {
# Issue REST request with invalid URL to cause exception ...
$json = Send-RESTRequest -method "Get" -uri "https://nowhere.com/rest/api" -logFile "D:\temp\log_file.txt"
}
Do-Something