关于powershell:您可以更改脚本的Out-Default行为吗?

Can you change the behavior of Out-Default for a script?

我有一个带有一系列invoke命令语句的脚本,每个语句的末尾都有代码,这些代码将输出到一个文件中。我可以简单地暂时改变默认的行为并稍微清理一下脚本吗?

1
... | Out-File $LogFile -append

[编辑]这在PowerShell 2.0上


你能?对。

1
filter Out-Default{ $_ | Out-File 'C:\logfile.txt' -append }

现在默认情况下,所有输出都将转到日志文件。通过删除临时定义

1
dir function:\Out-Default | del

但这是非常黑客,不明显,难以维护,所以我不推荐。最好定义一个简单的专用日志功能,这样您只需要向脚本的相关行添加| log。拥有一点可以明显理解、调试和更改的额外代码要比添加黑客来"简化"代码要好得多。


我不会更改Out-Default的工作方式,如果您有PowerShell 3.0,则可以为Out-File设置默认参数值,这样做不需要您在命令行上指定它们:

1
2
3
4
5
$PSDefaultParameterValues['Out-File:FilePath'] = $LogFile
$PSDefaultParameterValues['Out-File:Append'] = $true


... | Out-File


摘自《PowerShell食谱》,2013年:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<#  
.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 | % { $_ }
    }
}