PowerShell Write-Output在try / catch块中不起作用?

时间:2017-09-17 14:03:02

标签: powershell

以下是我的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方面相当环保,所以我们不胜感激。

2 个答案:

答案 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