Switch 语句不处理所有条件:检查 OU 是否存在

问题描述 投票:0回答:1

我正在尝试使用开关来测试不同的 OU 是否有匹配的位置代码 OU,这将导致计算机移动到我正在搜索的 OU 的子 OU 中。位置代码仅存在于一个 OU 中。因此,我正在通过 adsi.exists() 检查该 OU 是否存在,当在每个搜索位置中找到该位置 OU 时,它将返回 true 问题是我的开关似乎只评估第一个条件,然后继续移出转变。我不确定为什么会发生这种情况,有人可以建议吗?

我的期望:我希望开关中的每个条件都会被评估,直到一个条件匹配 TRUE,然后与该匹配相关的代码将被执行,将我的电脑移动到目录中的正确位置。

只做 if/else 是否会更好?

$LocationCode = $this.PCName.split("-")[0]
        
        try{
            $PCDC = (Get-ADComputer $this.PCName).DistinguishedName
            $FoundLCInOU = $true
            Switch ($FoundLCInOU) {
                # Check for location Code in Stores
                ([adsi]::Exists("OU DN")){
                    Write-Host " This computer belongs to the Location 1"
                }
                # Check for location code in CustomerExperienceCenter
                ([adsi]::Exists("OU DN")){
                    Write-Host "This Computer blongs to the Location 2"
                }
                # Check for location code in CAF
                ([adsi]::Exists("OU DN")){
                    Write-Host "This Computer Belongs to Location 3"
                }
                # Check for location code in HomeOffice 
                ([adsi]::Exists("OU DN")){
                    Write-Host "This computer belongs to the Location 4"
                }
            } catch {
                Write-Host "Couldn't find a home for this PC, just keep swimming..."
            }
powershell active-directory organizational-unit
1个回答
0
投票

根据您问题中代码的当前状态,以评论为基础:

  • switch
    语句的输入是一个static值,
    $true

  • 您的分支条件是全部相同

    ([adsi]::Exists("OU DN"))
    ,即它们测试是否存在相同的路径。

  • 换句话说:您没有执行与

    $LocationCode
    $PCDC
    中存储的变量信息相关的任何操作,并且行为取决于
    [adsi]::Exists()
    调用的返回值:

    • 如果是

      $false
      ,则没有分支被访问。

    • 如果是

      $true
      ,则访问 all 分支,即进行 all
      Write-Host
      调用,因为 - 除了特殊的
      Default
      分支之外 -
      switch
      评估 all 分支条件,即使找到匹配的人后。

      • 停止进一步评估,请使用
        continue
        break
      • break
        continue
        对于 single-value 输入(如本例所示)作用相同,但对于 array-valued 输入含义不同:
        continue
        移动到下一个数组元素,而
         break
        完全停止处理。

不知道你的真实需求,这里有一个更有意义的

switch
声明的例子;为简单起见,它根据已知字符串测试
$LocationCode
值:

try {
  $PCDC = (Get-ADComputer -ErrorAction Stop $this.PCName).DistinguishedName
  $locationCode = $this.PCName.split('-')[0]
  switch ($locationCode) {
    'Stores' {
      'This computer belongs to the Location 1'
      continue  # short-circuit
    }
    'CustomerExperienceCenter' {
      'This Computer blongs to the Location 2'
      continue  # short-circuit
    }
    'CAF' {
      'This Computer Belongs to Location 3'
      continue  # short-circuit
    }
    # Check for location code in HomeOffice 
    'HomeOffice' {
      'This computer belongs to the Location 4'
      continue  # short-circuit
    }
    Default {
      Write-Warning "Unknown location code: $locationCode"
    }
  }
}
catch {
  Write-Warning "Couldn't find a home for this PC, just keep swimming..."
}
© www.soinside.com 2019 - 2024. All rights reserved.