首页 > 解决方案 > 如何动态调用具有相同参数的 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

解决方案


这里的前三个示例涉及我个人如何处理重构代码,就像您展示的示例一样,您的特定问题的答案在最底部:)

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"

我只是真的更喜欢泼溅:)


推荐阅读