Powershell 您可以为脚本更改Out Default的行为吗?

Powershell 您可以为脚本更改Out Default的行为吗?,powershell,powershell-2.0,Powershell,Powershell 2.0,我有一个包含一系列Invoke命令语句的脚本,每个脚本的末尾都有代码,并将其写入文件。我可以简单地临时更改Out Default的行为并稍微清理一下脚本吗 ... | Out-File $LogFile -append [编辑] 这是在Powershell 2.0上的我不会改变Out Default的工作方式,如果您有Powershell 3.0,您可以为Out File设置默认参数值,这样做不需要您在命令行上指定它们: $PSDefaultParameterValues['Out-File:

我有一个包含一系列Invoke命令语句的脚本,每个脚本的末尾都有代码,并将其写入文件。我可以简单地临时更改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
但这是非常黑客,不明显,难以维护,所以我不推荐它。最好定义一个简单的专用日志函数,这样您只需要将
|log
添加到脚本的相关行中。拥有一点易于理解、调试和更改的额外代码要比添加黑客来“简化”代码要好得多。

摘自《Powershell Cookbook》,2013:


设置模式-版本3
新CommandWrapper输出默认值`
-开始{
$cachedOutput=新对象System.Collections.ArrayList
} `
-过程{
如果($\ ne$null){$null=$cachedOutput.Add($\ n)}
而($cachedOutput.Count-gt 500){$cachedOutput.RemoveAt(0)}
} `
-结束{
$uniqueOutput=$cachedOutput | Foreach对象{
$\.GetType().FullName}|选择-唯一
$containsInterestingTypes=($uniqueOutput-notcontains)`
“系统、管理、自动化、错误记录”)-以及
($uniqueOutput-不一样`
“Microsoft.PowerShell.Commands.Internal.Format.*”)
if($cachedOutput.Count-gt 0)-和$containsInterestingTypes)
{
$GLOBAL:ll=$cachedOutput |%{$}
}
}

对于隐式
输出文件
调用,替代
输出默认值
cmdlet的另一个不太模糊的方法是将感兴趣的命令包装在脚本块(
{…}
)中,并将其调用(
&
)通过管道传递到单个
输出文件
调用

除非需要控制输出编码,否则甚至可以使用
输出文件的有效别名

&{
#…将感兴趣的命令放在此处;例如:
“嗨”
获取项目/
约会
# ...
}>$LogFile
#如果需要控制输出编码,请使用
#`Out File$LogFile-Encoding…`而不是`>$LogFile`

总的来说:使用
/
Out File
创建的文件捕获了通常不适合编程处理的显示模式。

谢谢,这要好得多,但不幸的是,仅在v2.0上。如果您创建了名为
Out Default
的命令或别名,这就是您想要的,这会取代默认值吗?谢谢拉特金,这听起来是最好的解决方案。很好。删除功能的命令可以简化为:
Remove Item function:Out Default
链接到。源代码可在
<#  
.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 | % { $_ }
    }
}