我是VBScript的新手,而且对以下代码的工作原理感到困惑:
set Adapters = GetObject("winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
for each Nic in Adapters
if Nic.IPEnabled then
MsgBox "IP Address: " & Nic.IPAddress(asdf), 4160, "IP Address"
end if
next
当变量asdf
未定义时,它可以工作。如果我将asdf
定义为无效索引(例如-1或4),则会收到无效的索引错误。
我想:VBS中未定义的变量默认为0?不,我试图打印它,没有写任何东西。
将未定义变量作为数组索引传递返回数组中第一项记录的功能在哪里?在VBScript中编程时,我可能会遇到哪些其他相似的奇怪之处?
编辑:我发现的一些事情:
Empty
Empty = 0
是真的Nic.IPAddress(Empty)
也会返回数组的第一个元素MsgBox 0
将打印0
,而MsgBox Empty
将不打印任何内容我仍然无法找到任何文档,说明数组索引通过返回第一个元素来悄悄地处理Empty
,解释它为什么等效但是以不同于0的方式打印,以及其他构造处理{{1}参数(以及它们的结果)。
答案 0 :(得分:2)
未定义的变量为Empty
,返回数组的Empty
索引也将返回0
索引。
在IPAddress
数组中,有两个索引,0
和1
。
因此,这将与您的代码具有相同的效果:
MsgBox "IP Address: " & Nic.IPAddress(0), 4160, "IP Address"
和
MsgBox "IP Address: " & Nic.IPAddress(Empty), 4160, "IP Address"
这将为您提供IPv6地址:
MsgBox "IP Address: " & Nic.IPAddress(1), 4160, "IP Address"
此外,这将返回数组的两个索引:
WScript.Echo Join(Nic.IPAddress,",")
另外,请考虑这个例子,
arr = Array("first","second","third")
WScript.Echo arr(Empty)
此处的输出为first
有关VBScript数据类型的信息,请参阅此文章:
“空:变量未初始化。数值变量的值为0或字符串变量的值为零长度的字符串(”“)。
http://msdn.microsoft.com/en-us/library/9e7a57cf(v=vs.84).aspx
答案 1 :(得分:0)
非常感谢Langstrom提供的服务: “空:变量未初始化。数值变量的值为0,字符串变量的值为零长度的字符串(”“)。”
清除:强>
Nic.IPAddress(asdf)
将参数视为int,CInt(Empty)
等于0
,即数组第一个元素的索引。
MsgBox asdf
将参数视为字符串,CStr(Empty)
返回空字符串。
任何需要整数且0
为有效值的函数与使用0
参数调用时传递Empty
的函数完全相同。
比较Empty = 0
时,Empty
被视为整数,因为它与整数进行比较,因此表达式为真。
比较Empty = "0"
时,Empty
被视为字符串,因此表达式为false。因此,Empty = ""
是真的。
<强>空强>
另外,值得一提的是Null
不等于任何东西,包括它自己。 Null = Null
是假的。