我可以使用自己的自定义属性来装饰高级PowerShell函数吗?

时间:2009-07-09 01:27:09

标签: powershell function attributes

例如:

function TestThis()
{
    [MySpecialCustomAttribute]
    [CmdletBinding()]
    Param(...)
    Process{...}

}

1 个答案:

答案 0 :(得分:0)

是的,当然可以!

允许Attribute(或UsageType.All)的UsageType.Class派生的任何类型都可用于函数本身(即Param以上)

允许AttributeUsageType.Property使用的UsageType.Field派生的任何类型都可用于参数本身或变量。

只是懒惰并使用UsageType.All(例如内置OutputType属性就是这样),这种情况并不少见。

您甚至可以在PowerShell类中编写它们

using namespace System.Management.Automation
class ValidateFileExistsAttribute : ValidateArgumentsAttribute {
    [void] Validate([object]$arguments, [EngineIntrinsics]$engineIntrinsics) {
        if($null -eq $arguments) {
            throw [System.ArgumentNullException]::new()
        }
        if(-not (Test-Path -Path "$arguments" -Type Leaf)) {
            throw [System.IO.FileNotFoundException]::new("The specified path is not a file: '$arguments'")
        }        
    }
}

请参阅more examples博客上的Kevin Marquette

an older example here显示如何使用Add-Type在PowerShell 4及更早版本中执行此操作,虽然它现在有点过时,因为它显示的特定示例已集成到PowerShell 6中,不再需要

还有videos