【问题标题】:Powershell Switch Break Label not being executedPowershell 开关中断标签未执行
【发布时间】:2023-04-08 07:44:01
【问题描述】:

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

  1. 在屏幕上输入要迁移的用户,或
  2. 从文件导入。

如果选择了从文件导入选项 - 我想测试文件是否存在 - 如果没有,我想中断并返回到开关标签 :choose。但是,当我选择从文件导入选项并提供不存在的路径时,脚本会继续并且不会中断或返回标签。我哪里错了?

$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"

【问题讨论】:

  • 你想要一个 while 循环,而不是 switch

标签: powershell break


【解决方案1】:

来自documentation for break

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

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

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

【讨论】:

  • 开关可以有标签,可以循环。
【解决方案2】:

对交换机的中断将退出它。只有一个循环(开关,适用于数组),因此普通中断和中断开关之间没有区别。您似乎希望另一个循环中的开关重复它。

# 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

【讨论】:

  • 感谢您的帮助。我已经将乔伊的答案作为正确的答案 - 即使在您展示的示例中,对于带有标签的开关,您正在中断一段时间或 foreach 循环
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2022-01-05
  • 2013-07-09
  • 2016-03-17
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多