【发布时间】:2021-04-30 12:59:48
【问题描述】:
下午好,
我最近创建了一个 PowerShell 脚本,用于在 vCenter/ESXi 主机上运行之前自动化和测试 PowerCLI 脚本。
目前,我使用验证集让用户选择他们想要在哪个服务器/集群上执行脚本:
param(
[string]$script = "help",
[ValidateSet("localhost", "Server1", "Server2")]
[string]$server,
[ValidateSet("DC0_C0", "DC0_C1", "DC0_C2", "Customer1")]
[string[]]$cluster,
[switch]$help
)
问题是,有时当您有大客户时,他们可能有多个集群,只需键入“customer1”并让脚本在 cluster1/2 和 4 上运行会更方便,而不是手动键入所有集群:
./viexec vminfo localhost Cluster1,Cluster3,Cluster10
./viexec vminfo localhost Customer1 #And have the script run automatically on all the right clusters.
我已经尝试使用 if 来检查变量 $cluster 的值,如果它等于“Customer1”,那么它将用适当的集群替换他的值,但我认为这个解决方案并不优雅。而且很难配置/维护,因为用户需要修改代码,所以如果这些参数可以从外部配置文件/用户输入创建就更好了。
我还想知道是否可以从文件/csv 中检索 validateset 的参数,以避免用户自定义主 script.ps1,而是简单地将他们的服务器和集群替换/写入一个填充的 .CSV validateset 参数。
希望清楚..
问候, 亚历山德罗
【问题讨论】:
-
如果不同的值是静态的,
ValidateSets 效果最好,而这里显然不是。虽然它的学习曲线略高,但使用argument completion 更灵活。您可以在运行时从任何您喜欢的来源获取自动完成数据,包括但不限于 CSV 文件。 -
能否请您提供一个示例来说明如何实现它?比如集群参数的Validateset?
-
为了让@JeroenMostert 收到您的评论通知,您必须@-提及他(就像我刚才所做的那样)。他指的是实现制表符补全的命令-外部 方式,但是,它不包括参数validation。命令-external
Register-ArgumentCompleter解决方案的每个参数等效项是我的第一个答案中的命令-internal,每个参数System.Management.Automation.ArgumentCompleterAttribute解决方案,也需要添加' l 验证工作。
标签: powershell powercli validateset