gpt4 book ai didi

powershell - 在 PowerShell 脚本中定义动态 ValidateSet 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 14:52:38 26 4
gpt4 key购买 nike

我有一个 PowerShell 7.1 帮助程序脚本,用于将项目从 subversion 复制到本地设备。我想通过启用 PowerShell 将参数自动完成到此脚本中,使此脚本更易于使用。经过一些研究,看起来我可以实现一个接口(interface)来通过 ValidateSet 提供有效的参数。
基于 Microsoft's documentation ,我试图这样做:

[CmdletBinding()]
param (
[Parameter(Mandatory)]
[ValidateSet([ProjectNames])]
[String]
$ProjectName,

#Other params
)

Class ProjectNames : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues() {
# logic to return projects here.
}
}
当我运行它时,它不会自动完成,我收到以下错误:
❯ Copy-ProjectFromSubversion.ps1 my-project
InvalidOperation: C:\OneDrive\Powershell-Scripts\Copy-ProjectFromSubversion.ps1:4
Line |
4 | [ValidateSet([ProjectNames])]
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Unable to find type [ProjectNames].
这是有道理的,因为类是在参数之后才定义的。所以我将类移到参数上方。显然这是一个语法错误。那么我该怎么做呢?在简单的 PowerShell 脚本中是不可能的吗?

最佳答案

确实,您遇到了第 22 条问题:为了让参数声明在脚本解析阶段起作用,类 [ProjectNames]必须已经定义,但不允许将类定义放在参数声明之前。
使用独立脚本文件 ( .ps1 ) 最接近您的意图是使用 ValidateScript 属性代替:

[CmdletBinding()]
param (
[Parameter(Mandatory)]
[ValidateScript(
{ $_ -in (Get-ChildItem -Directory).Name },
ErrorMessage = 'Please specify the name of a subdirectory in the current directory.'
)]
[String] $ProjectName # ...
)
限制 :
  • [ValidateScript]没有也不能提供制表符补全 : script block , { ... } ,提供验证只预期返回一个 bool 值,并且不能保证甚至涉及一组离散的值。
  • 同样,您不能在 ErrorMessage 中引用动态生成的一组有效值(在脚本块内生成)。适当的值(value)。

  • 解决这些限制的唯一方法是复制计算有效值的脚本块部分,但这可能会成为维护难题。
    要获得制表符完成 您必须在 [ArgumentCompleter] 中复制代码的相关部分属性:
    [CmdletBinding()]
    param (
    [Parameter(Mandatory)]
    [ValidateScript(
    { $_ -in (Get-ChildItem -Directory).Name },
    ErrorMessage = 'Please specify the name of a subdirectory in the current directory.'
    )]
    [ArgumentCompleter(
    {
    param($cmd, $param, $wordToComplete)
    # This is the duplicated part of the code in the [ValidateScipt] attribute.
    [array] $validValues = (Get-ChildItem -Directory).Name
    $validValues -like "$wordToComplete*"
    }
    )]
    [String] $ProjectName # ...
    )

    关于powershell - 在 PowerShell 脚本中定义动态 ValidateSet 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68824015/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com