有人可以向我解释为什么下面没有按预期工作?在下面的示例中,我希望$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没有正确处理......
答案 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}}部分简化