PowerShell如何动态调用相同参数的不同Cmdlet以避免代码重复?
如何在PowerShell中动态切换Cmdlet以避免重复分支代码?
你想要的这种避免重复代码、动态切换Cmdlet的思路完全没问题,和C#里用委托的逻辑一致,但PowerShell里直接赋值do-it1会立即执行命令,而不是保存引用,所以得用以下两种正确的实现方式:
方法1:保存Cmdlet名称为字符串,用调用操作符执行
这种方式最简洁,适合两个Cmdlet参数格式完全一致的场景:
# 根据条件选择要调用的Cmdlet名称(字符串形式) $doWhat = if ($condition) { 'do-it1' } else { 'do-it2' } # 重复调用,参数可以是变量(替换成你实际的变量即可) & $doWhat -param1 $cookieParam -param2 $eatParam & $doWhat -param1 $bananaParam -param2 $pealParam & $doWhat -param1 $appleParam -param2 $coreParam & $doWhat -param1 $parachuteParam -param2 $dontParam
这里的&是PowerShell的调用操作符,用来执行存储在变量中的命令名称、脚本块或可执行文件。
方法2:使用脚本块(更接近C#委托的灵活度)
如果需要对参数做额外处理,或者两个Cmdlet的参数格式有细微差异,脚本块的方式更灵活:
# 定义脚本块,包装Cmdlet调用并声明参数 $doWhat = if ($condition) { { param($p1, $p2) # 这里可以添加额外逻辑,比如参数验证 do-it1 -param1 $p1 -param2 $p2 } } else { { param($p1, $p2) do-it2 -param1 $p1 -param2 $p2 } } # 调用脚本块,直接传入参数值(或变量) & $doWhat $cookieParam $eatParam & $doWhat $bananaParam $pealParam & $doWhat $appleParam $coreParam & $doWhat $parachuteParam $dontParam
这种方式就和C#的Action<string,string>委托几乎完全对应了,脚本块相当于一个匿名方法,你可以在里面加入任何自定义逻辑。
关键说明
两种方式都能彻底消除重复的if/else分支,无论你的参数是常量还是变量都能完美适配。如果后续需要新增更多Cmdlet分支,只需要修改初始的$doWhat赋值逻辑即可,不需要修改每一处调用代码。
内容的提问来源于stack exchange,提问作者DrFloyd5
相关产品推荐
相关产品推荐

