我有一个函数(实际上有几个)写输出(使用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
}
感谢。
答案 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