如果Powershell中的/ Else没有按预期运行?

时间:2018-02-27 17:33:34

标签: powershell

有人可以向我解释为什么下面没有按预期工作?在下面的示例中,我希望$shortFQDN变量设置为test.com,但我会回来www.test.com

$fqdn = 'dev.www.test.com'
$d3 = $fqdn.Split('.')[-3] #www
$d2 = $fqdn.Split('.')[-2] #website
$d1 = $fqdn.Split('.')[-1] #com

#Check if this is a 2LD domain (.com.au, .co.uk, .co.jp, etc.)
if ($d1 -ne 'com' -or 'net' -or 'org' -or 'edu' -or 'gov' -or 'biz') {
    $shortFQDN = -join ("$d3",'.',"$d2",'.',"$d1")
} else {
    $shortFQDN = -join ("$d2",'.',"$d1")
}

我做错了什么?好像if / else没有正确处理......

3 个答案:

答案 0 :(得分:8)

您的if()错了。虽然你可以说英语"如果a不是b或c或d,那么......",几乎所有编程语言 - 和脚本语言 - 你需要说"如果a是不是b而a不是c而a不是d,那么......"。

不是每次重做$fqdn.Split()三次并且每次都下标结果,而是从第一次获取输出,并将其分配给变量,然后简单地下标变量。

此外,PowerShell允许您使用范围,就像Pascal的一些方言一样,并且您可以将-match运算符与正则表达式一起使用。我将您的代码重写为

$fqdn = 'dev.www.test.com'
$d = $fqdn.Split(".")    # or $d = $fqdn -split "\."
$tlds = "com|net|org|edu|gov|biz"
if ( -not ($d[-3] -match $tlds) ) {
    $shortfqdn = $d[-3..-1] -join "."
} else {
    $shortfqdn = $d[-2..-1] -join "."
}

答案 1 :(得分:7)

这一系列表达方式:

$d1 -ne 'com' -or 'net' -or 'org' -or 'edu' -or 'gov' -or 'biz'

将翻译为:

$d1 -ne 'com' -or $true -or $true -or $true -or $true -or $true

改为使用-notcontains运算符:

if(@('com','net','org','edu','gov','biz') -notcontains $d1){
    ...
}

值得注意的是,您的方法似乎有点脆弱。对于直接分配2LD名称的ccTLD,它不起作用 - www.test.de仍会返回www.test.de

答案 2 :(得分:3)

从语法上讲,您似乎正在尝试这样做:

if (($d1 -ne 'com') -or ($d1 -ne 'net') -or ($d1 -ne 'org') -or ($d1 -ne 'edu') -or ($d1 -ne 'gov') -or ($d1 -ne 'biz') {
    $shortFQDN = -join ("$d3",'.',"$d2",'.',"$d1")
} else {
    $shortFQDN = -join ("$d2",'.',"$d1")
}

然而,听起来你真的想要这个逻辑:

if (($d1 -ne 'com') -and ($d1 -ne 'net') -and ($d1 -ne 'org') -and ($d1 -ne 'edu') -and ($d1 -ne 'gov') -and ($d1 -ne 'biz') {
    $shortFQDN = $d3,$d2,$d1 -join "."
} else {
    $shortFQDN = $d2,$d2 -join "."
}

简化是使用-notin,它将检查该值是否包含在数组中:

if ($d1 -notin @('com','net','org','edu','gov','biz') {
    $shortFQDN = $d3,$d2,$d1 -join "."
} else {
    $shortFQDN = $d2,$d1 -join "."
}

请注意,$d1是' com'在您的示例中,www.test.com$shortFQDN

的预期值

感谢-join {{1}}部分简化