如何根据参数更改输出类型

时间:2016-04-08 14:03:38

标签: powershell

我有一个函数(实际上有几个)写输出(使用Write-Output)。今天,这些函数都依赖于定义$ logpath并将它们输出到文本文件。在尽可能少的行中,我想配置输出到用户想要的选项(或者如果没有指定$ logpath)。

下面的代码不起作用,但是我想到的是一个例子。实现目标的最佳方式是什么?

Function Do-Stuff {
    Param (
        [string]$OutputType
    )

    If ($OutputType -eq 'Host') {
        $out = 'Write-Host'
    }
    Else {
        $out = 'Out-File -FilePath C:\test\log.txt -Append'
    }

    Write-Output ("You are inside the Do-Stuff function.") | $out
}

感谢。

3 个答案:

答案 0 :(得分:1)

向用户和文件输出内容的最简单方法显然是Tee-Object。但是,这将始终以两种方式创建输出,因此它无法按照您的需要进行配置。

我认为最好的解决方法是将$out变量替换为从管道读取输入的实际日志记录函数。

function Write-Log {
  [Cmdletbinding()]
  Param(
    [Parameter(
      Mandatory=$true,
      Position=0,
      ValueFromPipeline=$true,
      ValueFromPipelineByPropertyName=$true
    )]
    [string]$Message
  )
  ...
}

您可以通过检查(脚本)全局变量中是否定义了日志文件来控制输出:

if ($script:Logfile) {
  $Message | Add-Content $script:Logfile
} else {
  Write-Host $Message
}

或使每个输出方法依赖于不同的变量:

if ($script:Logfile) {
  $Message | Add-Content $script:Logfile
}
if ($script:WriteToConsole) {
  Write-Host $Message
}

您还可以在函数上使用其他参数:

function Write-Log {
  [Cmdletbinding()]
  Param(
    [Parameter(...)]
    [string]$Message,
    [Parameter(Mandatory=$false)]
    [string]Logfile = './default.log',
    [Parameter(Mandatory=$false)]
    [switch]$Console
  )
  ...
}

或上述任意组合。

对于日志记录,我可能更喜欢全局变量。这样,您可以在脚本顶部的一个位置定义所有日志记录设置(甚至使值取决于脚本参数),只需使用

... | Write-Log

无论何时你想要在你的代码中记录某些内容。

此外,每当您需要更改日志记录的工作方式时,您只需修改Write-Log函数,而无需触及其余代码。

答案 1 :(得分:0)

Function Do-Stuff {
    Param (
        [switch]$WriteHost
    )

    $message = Write-Output ("The function is doing stuff.") 
    If ($WriteHost -or ($logPath -eq $null)) {Write-Host $message} Else {$message | Out-File -FilePath $logPath -Append}
}

答案 2 :(得分:0)

一个老问题,但是我找不到我喜欢的答案。我想出的解决方案是使用过滤器覆盖Out-File cmdlet。

function Export-Stuff {
    param([string] $FilePath)

    if (-not $FilePath) { filter Out-File { $_ } }

    @('one','two','three') | Out-File -FilePath $FilePath
}
PS> Export-Stuff
one
two
three
PS> Export-Stuff -FilePath 'output.txt'
PS> Get-Content 'output.txt'
one
two
three