如何从PowerShell模块函数返回退出码且不终止当前Shell会话?
解决方法
问题出在PowerShell的exit命令会直接终止整个会话,所以不能在模块函数里用它来返回退出码。替代方案是通过$LASTEXITCODE变量传递退出码,同时保证PowerShell会话正常结束后将该值返回给Bash。
步骤1:修改PowerShell函数
将函数里的exit替换为设置全局的$LASTEXITCODE变量,这样不会终止当前会话:
function f { [CmdletBinding()] param ( [Parameter()][string]$Test ) process { # 设置退出码,0表示成功,非0表示失败 $global:LASTEXITCODE = 1 } }
Test.psm1保持不变,依然通过. .\Test.ps1引入该函数。
步骤2:在Bash中调用并获取退出码
在Bash里通过powershell命令加载模块、执行函数,PowerShell进程会自动将$LASTEXITCODE作为自身的退出码返回给Bash,你可以通过$?获取这个值:
# 调用PowerShell函数 powershell -Command "Import-Module ./Test.psm1; f ''" # 获取并打印退出码 echo "PowerShell函数返回的退出码:$?"
原理说明
$LASTEXITCODE是PowerShell的全局变量,默认存储外部命令的退出码,手动赋值后会覆盖原有值。- PowerShell进程结束时,会自动将
$LASTEXITCODE的值作为自身的退出码传递给父进程(Bash),这样Bash就能通过$?拿到预期的退出码。 - 函数中不使用
exit,避免直接终止PowerShell会话,确保整个命令执行完成后正常退出。
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

