我正在尝试使用开关来测试不同的 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..."
}
根据您问题中代码的当前状态,以评论为基础:
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..."
}