当前位置: 首页 > 知识库问答 >
问题:

PowerShell-有没有一种方法可以创建一种包含多个ValidateSet参数的“别名”?

公良阳波
2023-03-14

下午好,

param(
    [string]$script = "help",
    [ValidateSet("localhost", "Server1", "Server2")]
    [string]$server,
    [ValidateSet("DC0_C0", "DC0_C1", "DC0_C2", "Customer1")]
    [string[]]$cluster,
    [switch]$help
)
./viexec vminfo localhost Cluster1,Cluster3,Cluster10

./viexec vminfo localhost Customer1 #And have the script run automatically on all the right clusters.

问候你,亚历桑德罗

共有1个答案

裴畅
2023-03-14

以下是基于JSON的答案的一个变体:

>

  • 根据请求使用CSV文件作为数据源。

    显示了一个更简单的组合制表符完成和验证解决方案,其基础是将一个实现System.Management.Automation.IValidateSetValuesGenerator接口的类传递给ValidateSet属性(感谢地改编自此答案),但请注意,它需要PowerShell(Core)7+。

    首先,创建一个包含2个客户及其关联集群的示例CSV文件:

    # Create a sample CSV file that maps customer names to clusters.
    # This will serve as the basis for tab-completion / argument validation.
    # IMPORTANT: Be sure that you have enough headers (colum names) to cover 
    #            the maximum number of columns values.
    @'
    Customer,Cluster1,Cluster2,Cluster3,Cluster4,Cluster5
    Customer1,DC0_C0,DC0_C1,DC0_C2
    Customer2,DC1_C0,DC1_C1
    '@ > CustomersToClusters.csv
    

    在此基础上构建的代码:

    # Parse the CSV file, assumed to be located in the same dir.
    # as this script.
    $csvRows = Import-Csv $PSScriptRoot/CustomersToClusters.csv
    
    # Build a hashtable of customer names mapped to their associated clusters.
    $colCount = $csvRows[0].psobject.Properties.Name.Count
    $htCustomersToClusters = [ordered] @{}
    foreach ($row in $csvRows) {
      $htCustomersToClusters[$row.Customer] = $row.psobject.Properties.Value[1..($colCount-1)] -ne $null
    }
    # Build an array of all customer and cluster names.
    [string[]] $allCustomersAndClusters = $htCustomersToClusters.Keys + $htCustomersToClusters.GetEnumerator().ForEach({ $_.Value })
    
    # Define the custom class that implements the System.Management.Automation.IValidateSetValuesGenerator
    # interface, to be passed to the [ValidateSet()] attribute.
    class CustomerAndClusters : System.Management.Automation.IValidateSetValuesGenerator {
      [string[]] GetValidValues() { return $script:allCustomersAndClusters }
    }
    
    function Invoke-VI {
      param(
        # Provide tab-completion and validation based on the values
        # returned by a [CustomersAndClusters] instance's .GetValidValues() call.
        [ValidateSet([CustomerAndClusters])]
        [string[]] $Cluster
      )
    
      # Resolve the specified cluster arguments and remove duplicates from the
      # resulting list of cluster-only names.
      $resolvedClusters = $Cluster | ForEach-Object {
        # If a customer name was specified, resolve it to the list of associated clusters.
        if ($customerClusters = $htCustomersToClusters[$_]) { $customerClusters }
        else { $_ }
      } | Select-Object -Unique
      
      "Specified or implied clusters: $resolvedClusters"
    
    }
    

  •  类似资料:
    • 问题内容: 我正在尝试建立一个简单的Java程序,该程序可以从其他多个图像(jpg)创建一个动画gif。谁能给我一个有关如何在Java中实现此目标的信息?我已经搜索过Google,但找不到任何真正有用的信息。 感谢你们! 问题答案: 这里有一个类的示例,该类从不同的图像创建动画的gif: 链接 编辑:链接似乎已死。 无论如何,为了清楚起见,这段代码是由Elliot Kroo完成的。 编辑2:感谢您

    • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

    • 我有一个文档,它包含一个数组,如下所示。这是第一份文件。 我需要在聚合框架中用nestedData数组中的_id查找(连接)到另一个集合。

    • 问题内容: 假设我有以下代码: 这段代码的问题在于,协程内部的循环永远不会完成第一次迭代,而大小会不断增加。 为什么会这样发生,我该怎么解决? 我无法摆脱单独的线程,因为在我的真实代码中,我使用了单独的线程与串行设备进行通信,而且我还没有找到使用的方法。 问题答案: 不是线程安全的,因此您不能直接在多个线程中直接使用它。相反,您可以使用,它是提供线程感知队列的第三方库: 还有(全披露:我写了它),

    • Go的范围可以在地图和切片上迭代,但我想知道是否有一种方法可以在一系列数字上迭代,比如: 或者有没有一种方法来表示Go中的整数范围,就像Ruby对类范围所做的那样?

    • 我正在尝试设置一个webapp,通过JSON发送数据库表。我想不费吹灰之力把所有的参赛作品都寄出去。因此,我将所有字段读取为ArrayList,现在我可以通过JSON逐个解析并发送它们。但是,难道没有一种方便的方法将它们全部打包到一个JsonArray中吗? 下面是我的代码示例: