我正在尝试将代码从https://stackoverflow.com/questions/4554014/how-to-examine-and-manipulate-iis-metadata-in-c转换为VBVcript。
我的问题在于此代码:
Function LocateVirtualDirectory(ByVal siteName, ByVal vdirName)
On Error Resume Next
Dim site
For Each site in w3svc
If (site.KeyType = "IIsWebServer") And (site.ServerComment = siteName) Then
Set LocateVirtualDirectory = GetObject(site.Path & "/ROOT/" & vdirName)
Exit Function
End If
Next
End Function
如果site.ServerComment
是Empty
,则整个布尔表达式接收值Empty
,该值不是False,因此输入then语句。
写这个表达的正确方法是什么?越短越好。
感谢。
答案 0 :(得分:2)
我只是嵌套If
语句,并插入额外的检查以防范ServerComment
为Empty
的条件。我还将site.ServerComment
的值提取到临时变量comment
中,这样您就不会再访问该属性了两次。
例如:
Function LocateVirtualDirectory(ByVal siteName, ByVal vdirName)
On Error Resume Next
Dim site
Dim comment
For Each site in w3svc
If site.KeyType = "IIsWebServer" Then
comment = site.ServerComment
If (comment <> Empty) And (comment = siteName) Then
Set LocateVirtualDirectory = GetObject(site.Path & "/ROOT/" & vdirName)
Exit Function
End If
End If
Next
End Function
嵌套If
语句的另一个好处是使评估短路。 VBScript(和VB 6)不会使条件评估短路 - And
运算符作为逻辑运算符,要求对条件的两边进行测试,以便确定结果。因为没有理由检查ServerComment
如果KeyType
不匹配,您可以通过短路表达来获得一点性能。在VBScript中实现这一目标的唯一方法是嵌套(没有AndAlso
)。
我还应该指出,测试值= True
绝对没有意义。您只需将(site.ServerComment = siteName) = True
重写为site.ServerComment = siteName
,即可获得完全相同的结果。我花了至少几分钟来弄清楚你的原始代码甚至做了什么,因为这是一种非常自然的写条件方式。