提问人:5xum 提问时间:10/17/2023 最后编辑:5xum 更新时间:10/17/2023 访问量:32
定义自己的 ValidateSet 参数 [duplicate] 的 Powershell 脚本
Powershell script defining its own ValidateSet parameter [duplicate]
问:
设置:
我有包含一些文件夹的文件夹,为了论证,假设它们被命名为 、 、 和 。MCD1.4
MCD4.2
MCD1.3rc
tmp
personal
目标:
我想在我的根文件夹中创建一个 powershell 脚本,我可以“在”列出的文件夹之一上运行该脚本。但是,我只想允许脚本在名称以 开头的文件夹上运行。另外,为了简洁起见,我希望输入参数只是版本,前面没有“MCD”。换言之,这些应该被允许:process.ps1
MCD
.\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"
但这不起作用,因为显然,参数需要列在文件的最顶部。有什么方法可以实现脚本的预期行为吗?上面的脚本抛出以下错误:param
ps1
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
答: 暂无答案
评论
[ValidateScript()]
[ArgumentCompleter()]