我有一个包含一系列 Invoke-Command 语句的脚本,每个语句最后都有写出到文件的代码。我可以简单地暂时更改 Out-Default 的行为并稍微清理一下我的脚本吗?
... | Out-File $LogFile -append
[编辑] 这是在 Powershell 2.0 上
我有一个包含一系列 Invoke-Command 语句的脚本,每个语句最后都有写出到文件的代码。我可以简单地暂时更改 Out-Default 的行为并稍微清理一下我的脚本吗?
... | Out-File $LogFile -append
[编辑] 这是在 Powershell 2.0 上
我不会改变工作方式Out-Default
,如果你有 PowerShell 3.0,你可以为 设置默认参数值Out-File
,这样做不需要你在命令行上指定它们:
$PSDefaultParameterValues['Out-File:FilePath'] = $LogFile
$PSDefaultParameterValues['Out-File:Append'] = $true
... | Out-File
你可以吗?是的。
filter Out-Default{ $_ | Out-File 'C:\logfile.txt' -append }
现在默认情况下所有输出都将进入日志文件。通过删除临时定义
dir function:\Out-Default | del
但这非常hacky,不明显,并且难以维护,所以我不推荐它。最好定义一个简单的专用日志功能,这样您只需要添加| log
到脚本的相关行即可。拥有一些明显易于理解、调试和更改的额外代码,比仅仅为了“简化”代码而添加技巧要好得多。
来自“Powershell 食谱”,2013 年:
<#
.SYNOPSIS
Adds a new Out-Default command wrapper to store up to 500 elements from
the previous command. This wrapper stores output in the $ll variable.
#>
Set-StrictMode -Version 3
New-CommandWrapper Out-Default `
-Begin {
$cachedOutput = New-Object System.Collections.ArrayList
} `
-Process {
if($_ -ne $null) { $null = $cachedOutput.Add($_) }
while($cachedOutput.Count -gt 500) { $cachedOutput.RemoveAt(0) }
} `
-End {
$uniqueOutput = $cachedOutput | Foreach-Object {
$_.GetType().FullName } | Select -Unique
$containsInterestingTypes = ($uniqueOutput -notcontains `
"System.Management.Automation.ErrorRecord") -and
($uniqueOutput -notlike `
"Microsoft.PowerShell.Commands.Internal.Format.*")
if(($cachedOutput.Count -gt 0) -and $containsInterestingTypes)
{
$GLOBAL:ll = $cachedOutput | % { $_ }
}
}
Out-Default
为隐式调用覆盖 cmdlet 的一个不那么晦涩的替代方法Out-File
是将感兴趣的命令包装在脚本块( { ... }
) 中,并将其调用 ( ) 通过管道&
传递给单个 Out-File
调用。
除非您需要控制输出编码,否则您甚至可以使用>
,Out-File
的有效别名。
& {
# ... Put the commands of interest here; e.g.:
'hi'
Get-Item /
Get-Date
# ...
} > $LogFile
# If you need to control the output encoding, use
# `| Out-File $LogFile -Encoding ...` instead of `> $LogFile`
一般说明:使用>
/Out-File
捕获通常不适合编程处理的显示表示创建的文件。