如何修复PowerShell中Wait-Job因作业等待用户交互无法完成的错误
报错根本原因
这是PowerShell后台作业的固有机制限制:Start-Job启动的后台作业运行在独立的非交互式会话中,默认没有关联当前控制台的输入流,无法接收用户的交互式输入。当作业内部逻辑需要等待用户输入时,就会进入永久阻塞状态,触发你遇到的报错。你直接在当前会话调用函数时可以正常读取控制台输入,因此不会出现该问题。
解决方法
无法直接在Start-Job内部实现交互式输入,你需要把用户确认步骤移到主会话执行,拿到确认结果后作为参数传递给后台作业即可,修正后的代码如下:
# 先在主会话获取用户确认 $deleteConfirm = Read-Host "如果terraform init失败是否允许删除.terraform文件夹?请输入Y/N" $deleteConfirm = $deleteConfirm.Trim().ToUpper() -eq 'Y' $JobFunction2 = { param($allowDelete) function init { param($allowDelete) try { $output = terraform init $path = Get-Item -Path ".\" $in = $output | Select-String "Terraform has been successfully initialized!" if ($in) { Write-Host -ForegroundColor GREEN 'Initialization successfull' } else { if ($allowDelete) { Write-Host -ForegroundColor YELLOW '初始化失败,根据预设确认删除.terraform文件夹' $fail = del $path/.terraform -Force -Recurse $output = terraform init return $fail, $output } else { Write-Host -ForegroundColor RED '初始化失败,用户未授权删除.terraform文件夹,操作终止' return $null } } } catch { Write-Warning "初始化文件夹出错,路径为: $path" } } } # 把确认参数传入作业 Start-Job -InitializationScript $JobFunction2 -ScriptBlock { init $args[0] } -ArgumentList $deleteConfirm | Wait-Job | Receive-Job
补充说明
- 原代码中删除
.terraform文件夹的命令缺少-Recurse参数,当文件夹非空时会触发删除失败,修正代码已经补全该参数 - 原代码仅提示用户输入Y确认删除,但没有对应的读取用户输入的逻辑,会直接执行删除操作,修正代码已经补全了主会话的确认逻辑
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

