使用Invoke-Expression调用子脚本时如何退出返回父菜单脚本
PowerShell子脚本退出后返回父菜单解决方案
问题根因
你当前调用子脚本的方式是将子脚本加载到当前PowerShell会话的作用域中直接执行,break命令在找不到指定标签时,会终止整个会话层级的所有脚本运行,因此会直接退出主菜单脚本。你在子脚本内添加的标签仅在子脚本的作用域内生效,之所以未达到预期效果,是因为当前调用方式下作用域识别逻辑会把父子脚本视为同一运行上下文。
解决方案
方案一:修改父脚本调用逻辑(无需修改子脚本任何内容,推荐)
直接通过新的PowerShell子进程运行子脚本,子进程内的所有退出操作只会终止子进程本身,完全不会影响父脚本的运行。将原来的调用命令:
invoke-expression -Command "& '.\script.ps1'"
替换为以下代码即可:
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\script.ps1"
如果需要子脚本运行完成后保留窗口查看输出,可以添加-NoExit参数:
& powershell.exe -NoProfile -NoExit -ExecutionPolicy Bypass -File ".\script.ps1"
方案二:同会话运行(仅需修改子脚本少量代码)
如果不需要开启新进程,要在同一个PowerShell会话中运行子脚本,仅需要将子脚本中所有break script语句替换为return即可。return语句会直接终止当前子脚本的执行,返回父脚本的调用位置继续执行后续代码,不需要修改子脚本的其他业务逻辑。
内容的提问来源于stack exchange,提问作者LPChip
相关产品推荐
相关产品推荐

