PowerShell使用Continue标签语句 3


当你在一个循环的内部使用 “Continue”语句时,可以跳过循环的当前迭代,继续执行下一个迭代。如果使用了”Break”语句,则会跳过剩余的所有迭代循环。

这样就引发了一个问题,在一个多层嵌套循环中,哪一个循环会被影响。默认情况下,”Continue”只会影响到内层循环,但是你也可以用”Continue” 和 “Break” 指向外层循环的某一个标签。

:outer
Foreach ($element in (1..10))
{
for ($x = 1000; $x -lt 1500; $x += 100)
{
"Frequency $x Hz"
[Console]::Beep($x, 500)
continue outer
Write-Host '你我死生不复相见,除非你改了代码'
}
}

因为上面例子中的continue语句会调到外层循环中,所以我们会看到10次 1000Hz的输出,如果删除了continue语句后,循环次数明显会增加,write-host语句也不会跳过。

荔非苔注:这样的标签语句就像曾经的goto语句一样,太过灵活,大家尽量少用,它会使我们的代码的静态结构和动态结构不一致。

原文链接:“Continue” and Labels

×用微信扫描并分享
本文链接: https://www.pstips.net/continue-and-labels.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

Mooser Lee进行回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

3 条评论 “PowerShell使用Continue标签语句

  • sizhijuejiao

    您好,我这么用标签不对吗?
    还是说PS其实是把你文中的那段识别成了CMD所以你可以用?
    :outer
    $q1 = ([System.Management.Automation.Host.ChoiceDescription]”&1,电脑问题”)
    $q2 = ([System.Management.Automation.Host.ChoiceDescription]”&2,网络问题”)
    $q3 = ([System.Management.Automation.Host.ChoiceDescription]”&3,打印机问题”)
    $q4 = ([System.Management.Automation.Host.ChoiceDescription]”&4,电话问题”)
    $q5 = ([System.Management.Automation.Host.ChoiceDescription]”&5,其他”)
    $selection = [System.Management.Automation.Host.ChoiceDescription[]]($q1,$q2,$q3,$q4,$q5)
    $answer=$Host.UI.PromptForChoice(‘什么问题?’,’请选择:’,$selection,0)
    switch($answer)
    {
    0 {11111}
    1 {22222}
    2 {33333}
    3 {continue outer}
    4 {55555}
    }

    • Mooser Lee 文章作者

      这个标签,只能用于循环,叫做loop label,其他不能用。不建议学习,知道有这么个东西即可,因为这样写出的脚本可读性不强:

      :loop1 while($true){
          Write-Host "已进入第1个循环"
          break
      }
      
      
      $q1 = ([System.Management.Automation.Host.ChoiceDescription]”&1,电脑问题”)
      $q2 = ([System.Management.Automation.Host.ChoiceDescription]”&2,网络问题”)
      $q3 = ([System.Management.Automation.Host.ChoiceDescription]”&3,打印机问题”)
      $q4 = ([System.Management.Automation.Host.ChoiceDescription]”&4,电话问题”)
      $q5 = ([System.Management.Automation.Host.ChoiceDescription]”&5,其他”)
      
      
      :firstLoop while($true){
          Write-Host "已进入第2个循环"
          $selection = [System.Management.Automation.Host.ChoiceDescription[]]($q1,$q2,$q3,$q4,$q5)
          $answer=$Host.UI.PromptForChoice(‘什么问题?’,’请选择:’,$selection,0)
          switch($answer)
          {
          0 {11111}
          1 {22222}
          2 {33333}
          3 {continue loop1}
          4 {55555}
          }
      }
      
      
      • sizhijuejiao

        好的。谢谢。只是好奇。
        觉得没有goto了,实现cmd的这个效果要用好多循环
        goto可以随意跳很方便(当然用法自由到导致别人看不懂也确实难受)