未执行Powershell开关断开标签

未执行Powershell开关断开标签,powershell,break,Powershell,Break,作为更大脚本的一部分,我实现了下面详述的开关。其目的是,当执行脚本时,用户可以选择 在屏幕上输入要迁移的用户,或 从文件导入 如果选择了“从文件导入”选项-我想测试文件是否存在-如果不存在,我想中断并返回开关标签:选择。但是,当我选择“从文件导入”选项并提供不存在的路径时,脚本将继续,并且不会中断或返回到标签。我哪里做错了 $chooseInputMethod = @" This script migrates one or more user accounts between two trus

作为更大脚本的一部分,我实现了下面详述的
开关。其目的是,当执行脚本时,用户可以选择

  • 在屏幕上输入要迁移的用户,或
  • 从文件导入
  • 如果选择了“从文件导入”选项-我想测试文件是否存在-如果不存在,我想中断并返回开关标签
    :选择
    。但是,当我选择“从文件导入”选项并提供不存在的路径时,脚本将继续,并且不会中断或返回到标签。我哪里做错了

    $chooseInputMethod = @"
    This script migrates one or more user accounts between two trusted domains in a forest e.g. from domain1 to domain2 (or vice versa)
    
    Select method to specify user(s) to migrate:
    
    1. Enter name(s) on-screen (default)
    2. Import name(s) from file
    
    Enter selection number
    "@
    
    $choosePath = @"
    Enter path to file..
    
    Notes
    
      - Filename: 
        If file is located in script directory ($pwd) you can enter the filename without a path e.g. users.txt
    
      - No quotation marks: 
        DO NOT put any quotes around the path even if it contains spaces e.g. e:\temp\new folder\users.txt
    
    Enter path or filename
    "@
    
    $enterUsernames = @"
    Enter username(s) seperate each with a comma e.g. test1 or test1,test2,test3`n`nEnter name(s)
    "@
    
    cls
    :choose switch (Read-Host $chooseInputMethod) {
        1 { cls; $usersFromScreen = Read-Host $enterUsernames }
        2 {
            cls;
            $usersFromFile = Read-Host $choosePath;
            if (-not (Test-Path $usersFromFile -PathType Leaf)) {
                break choose
            }
        }
        default { cls; $usersFromScreen = Read-Host $enterUsernames }
    }
    
    Write-Host "hello"
    
    从:

    在PowerShell中,只有循环关键字(如Foreach、For和While)可以有标签

    因此,
    开关
    ,即使它具有循环功能,在这种情况下也不被视为循环


    但是,在这种情况下,我不明白为什么没有标签的
    中断
    是不够的。

    开关中断将退出它。只有一个循环(开关,在阵列上工作),所以普通中断和中断到开关之间没有区别。您似乎希望另一个循环中的开关重复此操作

    # only runs once
    :outer while (1) {
      'outer'
      while (1) {
        'inner'
        break outer
      }
    }
    
    
    outer
    inner
    
    带标签和循环的交换机演示。文档并不完美

    # only runs once
    :outer switch (1..10) {
      default {
        'outer'
        foreach ($i in 1..10) {
          'inner'
          break outer
        }
      }
    }
    
    
    outer
    inner
    
    另一个交换机演示

    switch (1..4) {
      { $_ % 2 } { "$_ is odd" }
      default    { "$_ is even" } 
    }
    
    1 is odd
    2 is even
    3 is odd
    4 is even
    

    您需要的是
    while
    循环,而不是
    开关
    。开关可以有标签,也可以循环。谢谢您的帮助。我认为乔伊的答案是正确的——即使在你所展示的例子中,对于一个带有标签的开关,你正在打破一段时间或一个foreach循环