如何修复错误 Wait-Job cmdlet 无法完成工作,因为一个或多个作业被阻止等待用户交互

Posted

技术标签:

【中文标题】如何修复错误 Wait-Job cmdlet 无法完成工作,因为一个或多个作业被阻止等待用户交互【英文标题】:how to fix the error Wait-Job cmdlet cannot finish working, because one or more jobs are blocked waiting for user interaction 【发布时间】:2022-01-07 15:18:19 【问题描述】:

我有一个函数要求用户输入 Y 或 N 来删除文件,我正在尝试将整个函数作为启动作业函数运行。我的代码是:

$JobFunction2 = 
    function init 
      
        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  
                Write-Host -ForegroundColor YELLOW 'Intiialization failed Please enter Y to delete the .terraform folder'
                $fail = del $path/.terraform -Force
                $output = terraform init 
                return $fail, $output
            
        
        catch 
            Write-Warning "Error Occurred while Initializing the folder and the path is: $path"
        
    

Start-Job -InitializationScript $JobFunction2 -ScriptBlock  init  | Wait-Job | Receive-Job 

当我运行 start-job 时,它显示“Wait-Job cmdlet 无法完成工作,因为一个或多个作业被阻止等待用户交互”。但是,如果我只调用函数名“init”而不开始工作,它就可以完美地工作。有什么方法可以提示用户输入 Y 或 No 以便该功能可以在 start-job 中工作?

【问题讨论】:

如果没有对作业执行上下文如何工作进行一些研究,这纯粹是猜测......,是否有可能以管理员或您要使用的文件夹结构的权限执行,因此@ 987654322@ 确实有效。在工作中,用户的步调上下文发生了变化,因此需要用户输入... 不清楚您在寻找什么...您想知道 Read-Host 是否可以在 Job 中使用? 谢谢大家的回复。我已经找到了解决这个问题的方法...我将 $fail 更改为 $fail = Remove-Item $path/.terraform -Force -Recurse -Confirm :$false 并且成功了 【参考方案1】:

不确定是什么将您的工作的 State 设置为 Blocked,但如果问题是:有什么方法可以提示用户输入 YN 以便该功能可以在Start-Job 中工作吗? 答案是肯定的,您可以在下面看到一个如何实现它的示例,注意我使用的是while 循环而不是Wait-Job

根据文档,该 cmdlet 有一个 -Sate 参数,它接受一个 <JobState> 参数,但我无法让它工作。甚至尝试过:

Wait-Job -Any -Force -State Blocked

遇到了和你一样的错误,所以这里是你可以使用的蛮力解决方案:

function init 
    
    'Initializing Function 0' -f $MyInvocation.MyCommand.Name
    
    do
    
        $choice = Read-Host 'Waiting for user input. Continue? [Y/N]'
        if($choice -notmatch '^y|n$')
        
            'Invalid input.'
        
    
    until ($choice -match '^y|n$')

    if($choice -eq 'y')
    
        'Continue script...'
    
    else
    
        'Abort script...'    
    


$funcDef = [scriptblock]::Create("function init  $function:init ")

$job = Start-Job -InitializationScript $funcDef -ScriptBlock  init 
$desiredState = 'Stopped', 'Completed', 'Failed'

while($job.State -notin $desiredState)

    if($job.State -eq 'Blocked')
    
        Receive-Job $job
    

    Start-Sleep -Milliseconds 500


$job | Receive-Job -Wait -AutoRemoveJob

【讨论】:

【参考方案2】:
$fail = Remove-Item $path/.terraform -Force -Recurse -Confirm:$false 

这帮助我解决了我的问题

【讨论】:

以上是关于如何修复错误 Wait-Job cmdlet 无法完成工作,因为一个或多个作业被阻止等待用户交互的主要内容,如果未能解决你的问题,请参考以下文章

x86 : 无法将“x86”项识别为 cmdlet函数脚本文件或可运行程序的名称。

错误记录在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称 )

错误记录在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称 )

Java :无法将Java项识别为 cmdlet函数脚本文件或可运行程序的名称

无法将“slmgr”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。如何解决?

解决无法将“xxxx”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。