PowerShell中无需if/switch语句直接调用其他函数的实现方法咨询
PowerShell中无需if/switch语句直接调用其他函数的实现方法咨询
首先来看你提供的原始代码:
function main { $options = @('option1', 'option2', 'option3') CLS; $n = 1 $options | foreach { "[{0}] {1}" -f $n, $_; $n++ } choice /c 123 /m "Choose:" "opt$lastexitcode" pause; main } function opt1 { "this is option one" } function opt2 { "this is option two" } function opt3 { "this is option three" } main
你的问题是:
如果可以直接通过输入函数名调用其他函数,而不需要使用if或switch语句?
当然可以实现!在PowerShell里,咱们可以利用**调用操作符&**来动态执行函数,完全不用依赖if/switch做分支判断。
针对你现有代码的修改方案
你其实已经做好了一半——通过"opt$lastexitcode"生成了对应选项的函数名字符串,只需要把这个字符串用&调用就行。修改后的main函数如下:
function main { $options = @('option1', 'option2', 'option3') CLS; $n = 1 $options | foreach { "[{0}] {1}" -f $n, $_; $n++ } choice /c 123 /m "Choose:" # 动态生成函数名并直接调用 & "opt$lastexitcode" pause; main } function opt1 { "this is option one" } function opt2 { "this is option two" } function opt3 { "this is option three" } main
原理很简单:"opt$lastexitcode"会根据用户选择的数字(1/2/3)生成对应的函数名字符串,比如选1就是"opt1",调用操作符&会自动把这个字符串解析成函数并执行它。
进阶:支持直接输入函数名调用
如果想让用户既可以按数字选,也能直接敲函数名调用,咱们可以稍微调整逻辑,用函数路径检查来实现:
function main { $options = @('option1', 'option2', 'option3') $functionNames = @('opt1', 'opt2', 'opt3') CLS; $n = 1 # 同时展示数字选项和对应的函数名提示 foreach ($i in 0..($options.Count-1)) { "[{0}] {1}(直接输入`{2}`也可调用)" -f ($i+1), $options[$i], $functionNames[$i] } Write-Host "请输入数字或函数名:" -NoNewline $inputValue = Read-Host # 无需if/switch分支,直接判断并执行 $targetFunc = if ($inputValue -match '^\d$' -and [int]$inputValue -le $functionNames.Count) { $functionNames[[int]$inputValue - 1] } else { $inputValue } # 检查函数是否存在,存在则调用 if (Test-Path "function:\$targetFunc") { & $targetFunc } else { Write-Host "无效的输入,请重试!" } pause; main } function opt1 { "this is option one" } function opt2 { "this is option two" } function opt3 { "this is option three" } main
这里用Test-Path "function:\$inputValue"来验证输入的字符串是否是已存在的函数,只要存在就直接用&调用,全程不需要写一堆if/switch分支!
备注:内容来源于stack exchange,提问作者Mr.Key7
相关产品推荐
相关产品推荐

