有时候,我们会遇到以下情况:
你想与局域网中的某台机器建立连接,你就需要输入对方的机器名。
现在我比较懒,我不想输入对方的机器名,或者对方的机器名很难记住,那怎么办呢?
那就做一个combox在页面上,当点击某按钮的时候,局域网中所有的机器名就会呈现在combox列表中,这样,只需要选择就可以了,能够满足一些懒人的要求。
1. 首选,DOS命令中的net view,可以查看局域网中所有的机器名,于是就有下面的函数:_GetDOSOutput, 可以把net view的结果完整的呈现出来;
2. Net view出来的结果是一个大字符串,我们需要的是机器列表,所以要处理这个大字符串,于是就有了函数:search_computers(),该函数的运行,需要排除几种情况:
1) 网络不通的情况下,net view是啥都没有的,所以当网络不通,我们将会获取“网络不通”的提示性语言;
2) 网络通的情况下,可以应用正则表达式把所有的机器名筛选出来,但是筛选出来的结果应该去掉运行脚本的机器本身,避免配置工具使用者晕点,最大程度的减少错误发生几率;
3. set_combox_list 就可以把任何数组或者字符串,塞入一个combox控件中去,就能够实现人性化的配置了。
#include <array.au3> #include <Constants.au3> Func search_computers() $content = _GetDOSOutput("net view") $computers = StringRegExp($content, "\\\\.*?\s", 3) $len = UBound($computers) If $len = 0 Then Return "网络不通" EndIf Local $computer_list[$len] For $i = 0 To $len-1 $computer_list[$i] = StringStripWS($computers[$i], 2) $computer_list[$i] = StringReplace($computer_list[$i], "\\", "") Next _ArrayDelete($computer_list, @ComputerName) Return $computer_list EndFunc Func _GetDOSOutput($sCommand) Local $iPID, $sOutput = "" $iPID = Run('"' & @ComSpec & '" /c ' & $sCommand, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) While 1 $sOutput &= StdoutRead($iPID, False, False) If @error Then ExitLoop EndIf Sleep(10) WEnd Return $sOutput EndFunc Func set_combox_list($computer_name) $computer_list = search_computers() If IsArray($computer_list) Then For $i = 0 To UBound($computer_list)-1 _GUICtrlComboBox_AddString($computer_name, $computer_list[$i]) Next _GUICtrlComboBox_SetEditText($computer_name, "请选择大屏机器") Else _GUICtrlComboBox_SetEditText($computer_name, $computer_list) EndIf EndFunc