PowerShell提示特定输入,然后继续脚本

w8f9ii69  于 2023-06-06  发布在  Shell
关注(0)|答案(2)|浏览(165)

我被这个powershell脚本卡住了。
该脚本执行以下操作:当用户按下y时:1.球棒打开并运行3秒,然后关闭。然后,脚本询问用户是否要再次运行1.bat,或者当用户按下q时,脚本需要继续,但脚本结束

#Asks to start Password reset again if it fails
while($true) {
$readHostValue = Read-Host -Prompt "If Password reset fails enter y or q to continue install"

switch ($readHostValue) {
    'y' { Start-Process C:\Users\deniz\Desktop\1.bat -Verb RunAs }
    'q' { return # Ending password reset and continue script
        }
        Default { write-host "Invalid input y or n!" }
        }
    }

脚本到此停止,但需要继续执行以下操作:

#progress indicators/write-progress
Write-Progress -Activity "AfterLoader" -Status "Installing" -PercentComplete 10
Start-Sleep -Seconds 2
vkc1a9a2

vkc1a9a21#

正如Rav's answer所指出的,returnswitch语句的action块的上下文中退出封闭的 * 函数或脚本 *。
相比之下,break和- situationally[1] -continue只退出switch语句,这意味着你的无限循环(while ($true) { ... })继续,除非你采取额外的行动。
在这种情况下,您可以利用break语句的一个罕见变体,即可以针对 *labeled语句 * 进行中断的变体:

# Note the self-chosen "menu:" label
:menu while ($true) {

  $readHostValue = Read-Host -Prompt 'If Password reset fails enter y or q to continue install'
  
  switch ($readHostValue) {
    'y'     { "running things..." }
    'q'     { break menu } # Break out of "menu:" labeled while loop.
    default { Write-Host 'Invalid input y or q!' }
  }

}

'continuing...'

或者,您可以使用布尔变量来确定何时退出while循环:

$continue = $true
while ($continue) {

  $readHostValue = Read-Host -Prompt 'If Password reset fails enter y or q to continue install'
  
  switch ($readHostValue) {
    'y'     { "running things..." }
    'q'     { 
       $continue = $false # signal that the while loop should exit
       break              # break out of the switch statement
    } 
    default { Write-Host 'Invalid input y or q!' }
  }

}

'continuing...'

[1]如果输入值为 arrayswitch,则continue将继续执行 * 下一个元素 *。如果输入是单个对象或单元素数组continuebreak具有相同的效果,即它退出语句。

iezvtpos

iezvtpos2#

return语句将退出整个脚本,而不仅仅是循环。这就是为什么你的脚本会停在那里,而不执行其余的代码。

相关问题