Да, конечно, вы можете!
Любой тип, производный от Attribute
, который допускает UsageType.All
(или UsageType.Class
), может использоваться в самой функции (т. Е. Выше Param
)
Любой тип, производный от Attribute
, который допускает использование UsageType.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'")
}
}
}
См. другие примеры на Кевин Маркетт блог.
Здесь есть более старый пример , показывающий, как это сделать в PowerShell 4 и более ранних версиях с использованием Add-Type, хотя сейчас он немного устарел, поскольку конкретный пример, который он показывает, был интегрирован в PowerShell 6. и больше не нужен ?
Есть также видео