powershell - 如何动态调用具有相同参数的 2 个不同的 cmdlet?(不是动态参数。)
问题描述
我有类似的代码
if ($condition) {
do-it1 -param1 "cookies" -param2 "eat"
do-it1 -param1 "bananas" -param2 "peal"
do-it1 -param1 "apples" -param2 "core"
do-it1 -param1 "parachuting" -param2 "dont"
} else {
do-it2 -param1 "cookies" -param2 "eat"
do-it2 -param1 "bananas" -param2 "peal"
do-it2 -param1 "apples" -param2 "core"
do-it2 -param1 "parachuting" -param2 "dont"
}
我想做的是
if ($condition) {
$doWhat = do-it1
} else {
$doWhat = do-it2
}
$doWhat -param1 "cookies" -param2 "eat"
$doWhat -param1 "bananas" -param2 "peal"
$doWhat -param1 "apples" -param2 "core"
$doWhat -param1 "parachuting" -param2 "dont"
在 C$ 中,我只会使用委托或更多面向对象的东西。
Action<string,string> doWhat = condition? doIt1:doIt2;
doWhat("cookies","eat");
doWhat("bananas","peal");
doWhat("apples","core");
doWhat("parachuting","dont");
在我的真实代码中,我没有使用常量作为doWhat
.
如何更改我的脚本正在调用的 cmdlet,而无需使用一堆类似的 if 分支复制代码?
提前感谢!
解决方案
这里的前三个示例涉及我个人如何处理重构代码,就像您展示的示例一样,您的特定问题的答案在最底部:)
PowerShell 支持 splatting - 也就是说,多个命名参数参数可以作为单个字典传递:
$paramArgs = @{
"param1" = "cookies"
"param2" = "eat"
}
if ($condition) {
do-it1 @paramArgs
}
else {
do-it2 @paramArgs
}
因此,创建一个字典数组,每次调用一个,我们可以将代码简化为:
$paramArgTables = @(
@{ param1="cookies"; param2="eat"}
@{ param1="bananas"; param2="peal" }
@{ param1="apples"; param2="core" }
@{ param1="parachuting"; param2="dont" }
)
if ($condition) {
$paramArgTables |ForEach-Object {
do-it1 @_
}
}
else {
$paramArgTables |ForEach-Object {
do-it2 @_
}
}
&
您还可以通过使用调用运算符(也支持喷溅)按名称调用目标命令来更进一步:
$paramArgTables = @(
@{ param1="cookies"; param2="eat"}
@{ param1="bananas"; param2="peal" }
@{ param1="apples"; param2="core" }
@{ param1="parachuting"; param2="dont" }
)
$cmdName = if($condition){
'do-it1'
}
else{
'do-it2'
}
$paramArgTables |ForEach-Object {
& $cmdName @_
}
这意味着你也可以做你想做的事:
$cmdName = if($condition){
'do-it1'
}
else{
'do-it2'
}
& $cmdName -param1 "cookies" -param2 "eat"
& $cmdName -param1 "bananas" -param2 "peal"
& $cmdName -param1 "apples" -param2 "core"
& $cmdName -param1 "parachuting" -param2 "dont"
我只是真的更喜欢泼溅:)
推荐阅读
- c - 为什么终端在运行 win32 窗口时不显示 printf 消息
- python - 使用 UDF 生成 UUID 列,然后拆分为具有公共 UUID 列的两个数据框
- python-3.x - django-filter 不过滤查询
- php - 谁能找到并帮助我这个错误是关于什么的?
- swift - Swift json 调用返回空括号,nil 无法检查它
- javascript - no-unused-expressions:需要赋值或函数
- python - 如何重新采样直到满足特定日期条件
- javascript - 按钮单击时 Highcharts 刷新工具提示不适用于 boost 模块
- kubernetes - 是否可以在 GKE 的区域集群中创建仅限区域的节点池?
- github - 带有生成文件的 GitHub 版本