定义自己的 ValidateSet 参数 [duplicate] 的 Powershell 脚本

Powershell script defining its own ValidateSet parameter [duplicate]

提问人:5xum 提问时间:10/17/2023 最后编辑:5xum 更新时间:10/17/2023 访问量:32

问:

设置

我有包含一些文件夹的文件夹,为了论证,假设它们被命名为 、 、 和 。MCD1.4MCD4.2MCD1.3rctmppersonal

目标

我想在我的根文件夹中创建一个 powershell 脚本,我可以“在”列出的文件夹之一上运行该脚本。但是,我只想允许脚本在名称以 开头的文件夹上运行。另外,为了简洁起见,我希望输入参数只是版本,前面没有“MCD”。换言之,这些应该被允许:process.ps1MCD

.\process.ps1 -version 4.2
.\process.ps1 -version 1.4
.\process.ps1 -version 1.3rc

但其他人应该是无效的。只要文件夹结构保持固定,我就可以按如下方式实现:

param(
    [Parameter(Position=0)]
    [ValidateSet('4.2','1.4','1.3rc')
    [System.String]$version
)

Write-Host "Now processing folder MCD$version"

只要文件夹结构保持不变,这个脚本的行为就完全符合我的要求。


但是,我想使它更加动态,脚本考虑了实际的文件夹结构。我想做的是这样的:

$folders = Get-ChildItem . -Directory
$options = [System.Collections.ArrayList]::new()
foreach ($item in $folders) {
    if ($item.Name.StartsWith("MCD")) {
        $options.Add($item.Name.Substring(3))
    }
}
param(
    [Parameter(Position=0)]
    [ValidateSet($options)
    [System.String]$version
)

Write-Host "Now processing folder MCD$version"

但这不起作用,因为显然,参数需要列在文件的最顶部。有什么方法可以实现脚本的预期行为吗?上面的脚本抛出以下错误:paramps1

At C:\path\to\process.ps1:15 char:18
+     [ValidateSet($options)]
+                  ~~~~~~~~
Attribute argument must be a constant or a script block.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : ParameterAttributeArgumentNeedsToBeConstantOrScriptBlock
PowerShell 参数 参数传递

评论

2赞 mklement0 10/17/2023
不幸的是,您可以使用 和 的组合,这有点麻烦。我希望很清楚如何在链接的副本中加入代码。[ValidateScript()][ArgumentCompleter()]
1赞 5xum 10/17/2023
@mklement0 非常有用,非常感谢。

答: 暂无答案