PowerShell - 定义多个 IF 语句结果

PowerShell - Defining multiple IF statements outcomes

我在使用以下脚本时遇到问题。 我的目标是通过下面的所有 if 语句检查 $city,并 return 给我正确的 $region。 目前它保持 returning 返回“NA-West”,因为那是我最后的 if 语句。 感谢任何帮助,谢谢

$city = "New York"
if ($city -eq "Bangalore" -or "Hong Kong" -or "Jakarta" -or "Melbourne" -or "New Delhi" -or "Seoul" -or "Shanghai" -or "Sydney" -or "Taipei City" -or "Tokyo") {
$region = "APAC"
}
if ($city -eq "Hamburg" -or "London" -or "Madrid" -or "Milan" -or "Paris" ) {
$region = "EMEA"
}
if ($city -eq 'Chicago' -or 'Detroit' -or 'New York' -or 'Toronto') {
$region = "NA-East"
}
if ($city -eq "Bellevue" -or "Boulder" -or "Denver" -or "Irvine" -or "Los Angeles" -or "San Francisco" -or "San Jose" -or "Santa Barbara" -or "Seattle" -or "Ventura") {
$region = "NA-West"
}
Write-Host "This is the region: " $region
Write-Host "This is the city: " $city

这没有按预期工作,因为你所有的 if 条件都是 总是 真 - 所以 $region = "NA-West" 总是最后执行。

原因是 -or 运算符是一个 布尔逻辑 运算符 - 它需要两个操作数并评估其中是否至少有一个是“真实的”,通过试图将任一值转换为 [bool](例如 $true$false)。

当你有这样的表达时:

$city -eq "Bellevue" -or "Boulder"

PowerShell 有效地将其解释为:

[bool]($city -eq "Bellevue") -or [bool]("Boulder")

当 PowerShell 将字符串转换为 [bool] 时,规则是 空字符串 被转换为 $false,而 non-empty 字符串(如“Boulder”)被转换为$true.

所以你最后的 if 声明与你写的完全一样:

if ($city -eq "Bellevue" -or $true -or $true -or $true -or $true -or $true -or $true -or $true -or $true -or $true) {

您需要继续重申您要进行的比较:

if($city -eq "Bellevue" -or $city -eq "Boulder" -or $city -eq "Denver" -or $city -eq "Irvine" -or $city -eq "Los Angeles" -or $city -eq "San Francisco" -or $city -eq "San Jose" -or $city -eq "Santa Barbara" -or $city -eq "Seattle" -or $city -eq "Ventura")

或者,更好的是,改用 -contains/-in 运算符:

if($city -in "Bellevue", "Boulder", "Denver", "Irvine", "Los Angeles", "San Francisco", "San Jose", "Santa Barbara", "Seattle", "Ventura")

根据您的代码,它将是

$city = "New York"
if ($city -eq "Bangalore" -or $city -eq "Hong Kong" -or $city -eq "Jakarta" -or $city -eq "Melbourne" -or $city -eq "New Delhi" -or $city -eq "Seoul" -or $city -eq "Shanghai" -or $city -eq "Sydney" -or $city -eq "Taipei City" -or $city -eq "Tokyo") {
    $region = "APAC"
}
if ($city -eq "Hamburg" -or $city -eq "London" -or $city -eq "Madrid" -or $city -eq "Milan" -or $city -eq"Paris" ) {
    $region = "EMEA"
}
if ($city -eq 'Chicago' -or $city -eq 'Detroit' -or $city -eq 'New York' -or $city -eq 'Toronto') {
    $region = "NA-East"
}
if ($city -eq "Bellevue" -or $city -eq "Boulder" -or $city -eq "Denver" -or $city -eq "Irvine" -or $city -eq "Los Angeles" -or $city -eq "San Francisco" -or $city -eq "San Jose" -or $city -eq "Santa Barbara" -or $city -eq "Seattle" -or $city -eq "Ventura") {
    $region = "NA-West"
}
Write-Host "This is the region: " $region
Write-Host "This is the city: " $city