PowerShell中的动态参数、枚举与类
立即解锁
发布时间: 2025-08-14 00:54:58 阅读量: 20 订阅数: 20 


精通PowerShell脚本编写:自动化与简化任务
# PowerShell 中的动态参数、枚举与类
## 1. 动态参数
### 1.1 动态参数的错误示例
以下代码如果粘贴到控制台或通过编辑器执行会引发错误:
```powershell
function Test-DynamicParam {
[CmdletBinding()]
param ( )
dynamicparam { }
Write-Host 'Function body'
}
```
在 PowerShell 7 中,第一个错误消息会明确指出 `Write-Host` 是意外的,需要一个命名块:
```plaintext
ParserError:
Line |
7 | Write-Host 'Function body'
| ~~~~~~~~~~
| unexpected token 'Write-Host', expected 'begin', 'process', 'end', or
'dynamicparam'.
```
在 Windows PowerShell 中,错误提示不太明确,指出缺少右花括号:
```plaintext
At line:1 char:28
+ function Test-DynamicParam {
+ ~
Missing closing '}' in statement block or type definition.
+ CategoryInfo : ParserError: (:) [],
ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
```
### 1.2 创建 RuntimeDefinedParameter 对象
`RuntimeDefinedParameter` 对象描述单个参数,其定义包括参数名称、参数类型以及要为该参数设置的任何属性。PowerShell 没有用于创建 `RuntimeDefinedParameter` 的类型加速器,必须使用全名 `System.Management.Automation.RuntimeDefinedParameter`。
构造函数需要三个参数:一个字符串(参数名称)、一个 .NET 类型(参数类型)以及一个属性集合或数组。属性集合必须至少包含一个 `Parameter` 属性,以告知 PowerShell 该参数可以属于哪些参数集。
以下示例创建一个名为 `Action` 的参数:
```powershell
using namespace System.Management.Automation
$parameter = [RuntimeDefinedParameter]::new(
'Action',
[string],
[Attribute[]]@(
[Parameter]@{ Mandatory = $true; Position = 1 }
[ValidateSet]::new('Start', 'Stop', 'Create', 'Delete')
)
)
```
这相当于在 `param` 块中使用以下代码:
```powershell
param (
[Parameter(Mandatory, Position = 1)]
[ValidateSet('Start', 'Stop', 'Create', 'Delete')]
[string]
$Action
)
```
### 1.3 使用 RuntimeDefinedParameterDictionary
`RuntimeDefinedParameterDictionary` 是 `dynamicparam` 块的预期输出。该字典必须包含函数预期呈现的所有动态参数。
以下示例创建一个字典并添加单个参数:
```powershell
using namespace System.Management.Automation
function Test-DynamicParam {
[CmdletBinding()]
param ( )
dynamicparam {
$parameters = [RuntimeDefinedParameterDictionary]::new()
$parameter = [RuntimeDefinedParameter]::new(
'Action',
[string],
[Attribute[]]@(
[Parameter]@{ Mandatory = $true; Position = 1 }
[ValidateSet]::new(
'Start',
'Stop',
'Create',
'Delete'
)
)
)
$parameters.Add($parameter.Name, $parameter)
$parameters
}
}
```
### 1.4 使用动态参数
动态参数通常通过函数或脚本中的 `PSBoundParameters` 变量访问。
以下示例展示如何使用 `PSBoundParameters` 检索 `Action` 参数的值:
```powershell
using namespace System.Management.Automation
function Test-DynamicParam {
[CmdletBinding()]
param ( )
dynamicparam {
$parameters = [RuntimeDefinedParameterDictionary]::new()
$parameter = [RuntimeDefinedParameter]::new(
'Action',
[string],
[Attribute[]]@(
[Parameter]@{ Mandatory = $true; Position = 1 }
[ValidateSet]::new(
'Start',
'Stop',
'Create',
'Delete'
)
)
)
$parameters.Add($parameter.Name, $parameter)
$parameters
}
end {
Write-Host $PSBoundParameters['Action']
}
}
```
### 1.5 接受管道输入的动态参数
接受管道输入的动态参数,与接受管道输入的普通参数一样,仅在 `process` 和 `end` 块中有值。`end` 块只会看到管道中的最后一个值。
以下示例演示了这一点:
```powershell
using namespace System.Management.Automation
function Test-DynamicParam {
[CmdletBinding()]
param ( )
dynamicparam {
$parameters = [RuntimeDefinedParameterDictionary]::new()
$parameter = [RuntimeDefinedParameter]::new(
'InputObject',
[string],
[Attribute[]]@(
[Parameter]@{
Mandatory = $true
ValueFromPipeline = $true
}
)
)
$parameters.Add($parameter.Name, $parameter)
$parameters
}
begin {
'BEGIN: Input object is present: {0}' -f @(
$PSBoundParameters.ContainsKey('InputObject')
)
}
process {
'PROCESS: Input object is present: {0}; Value: {1}' -f @(
$PSBoundParameters.ContainsKey('InputObject')
$PSBoundParameters['InputObject']
)
}
end {
'END: Input object is present: {0}; Value: {1}' -f @(
```
0
0
复制全文
相关推荐










