【问题标题】:Powershell wrong exit point from conditionPowershell错误的退出点
【发布时间】:2020-08-23 19:27:40
【问题描述】:

我有这部分代码:

# Check how the kstart servers accessible
ping -n 1 sg-start-6001
$sgkstartcheck = $?

If($sgkstartcheck -ne 'True'){
$sgkstart = "10.104.170.250"
}
else {
$sgkstart = "sg-start-6001"
}

ping -n 1 am-start-4001.
$amkstartcheck = $?

If($amkstartcheck -ne 'True'){
$amkstart = "10.201.180.250"
}
else {
$amkstart = "am-start-4001"
}

ping -n 1 sh-start-8001
$shkstartcheck = $?

If($shkstartcheck -ne 'True'){
$shkstart = "10.113.170.250"
}
else {
$shkstart = "sh-start-8001"
}

ping -n 1 as-start-3001
$askstartcheck = $?

If($askstartcheck -ne 'True'){
$askstart = "10.46.160.250"
}
else {
$askstart = "as-start-3001"
}

ping -n 1 bk-start-1001
$bkkstartcheck = $?

If($bkkstartcheck -ne 'True'){
$bkkstart = "10.120.195.251"
}
else {
$bkkstart = "bk-start-1001"
}

$installfile = "windows/winlogbeat-6.2.4-windows-x86_64.zip"
$filebeatforwininstallfile = "windows/filebeat-6.2.4-windows-x86_64.zip"
$filename = "C:\winlogbeat-6.2.4-windows-x86_64.zip"
$filebeatfilename = "C:\filebeat-6.2.4-windows-x86_64.zip"
$webClient = New-Object System.Net.WebClient
$webClient.Proxy = [System.Net.GlobalProxySelection]::GetEmptyWebProxy()

if($site -eq 'HKG1') {$webClient.DownloadFile("http://hk-rep-2001/$installfile",$filename)}
elseif($site -eq 'AMS4') {$webClient.DownloadFile("http://$amkstart/$installfile",$filename)}
elseif($site -eq 'SIN1' -or 'SIN3') {$webClient.DownloadFile("http://$sgkstart/$installfile",$filename)}
elseif($site -eq 'SHA1' -or 'SHA2') {$webClient.DownloadFile("http://$shkstart/$installfile",$filename)}
elseif($site -eq 'ASH1') {$webClient.DownloadFile("http://$askstart/$installfile",$filename)}
elseif($site -eq 'BKK1') {$webClient.DownloadFile("http://$bkkstart/$installfile",$filename)}

网站是 ASH1。

为什么脚本会尝试使用 SIN 值进行下载?

站点是ASH1,为什么会进入SIN elseif?

似乎是因为在 ping 测试中,sin 是第一个,这是真的,但它使用这个脚本安装了几个 10000 个虚拟机,然后它就来了:/

【问题讨论】:

    标签: powershell if-statement scripting conditional-statements


    【解决方案1】:

    $site -eq 'SIN1' -or 'SIN3'

    应该是:

    $site -eq 'SIN1' -or $site -eq 'SIN3'
    

    或者,更符合 PowerShell 的习惯:

    $site -in 'SIN1', 'SIN3'
    

    ... -or 'SIN3' 将 RHS 视为布尔值,在布尔上下文中任何非空字符串都被视为 $true,因此总体条件始终为真。


    顺便说一句:最好避免将布尔值与 字符串 进行比较;代替$askstartcheck -ne 'True',使用$askstartcheck -ne $true,或者,最好使用-not $askstartcheck

    【讨论】:

    • 很高兴听到这个消息,@RebronTreborn。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多