我正在VBScript中使用netstat
命令来找出正在监听的端口。作为一个过程,我正在从两个变量中读取IP地址和端口号。
文件包含IP地址,端口号,并用逗号分隔,如下所示:
10.x.x.x,3389
就像文件中存在多个IP和端口号一样。通过使用数组概念,我正在使用myarray(0)
和myarray(1)
变量从文件中获取IP地址和端口号。
我的代码如下:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = WScript.CreateObject("WScript.Shell")
Dim port_number, port_status, port_conn_ip, portread, portfile, PSExec, PCIExec
objShell.CurrentDirectory = "C:\Program Files (x86)\GnuWin32\bin"
Set objfile = objFSO.openTextFile("C:\IBM\port_mon\list_of_ports.txt")
Do until objFile.AtEndOfStream
portread = objfile.ReadLine
portfile = Split(portread, ",")
Set PSExec = objShell.Exec("%comspec% /k ""netstat -an |find ""myvalue(0) ""|find ""myvalue(1)""|awk ""{print $4}""""")
port_status = PSExec.Stdout.ReadLine
WScript.Echo port_status
但是这里myvalue(0)
和myvalue(1)
并未使用IP地址或端口号进行更新。我也尝试提供类似" & myvalue(0) & "
的方法,但这也没有给我任何结果。输出始终为空。
作为背景工作,我已验证IP地址和端口号的连通性均处于连接和已建立状态。
答案 0 :(得分:0)
字符串串联方法是正确的做法。 VBScript不会在字符串内扩展变量。但是,数组变量的名称为portfile
,而不是myvalue
(或myarray
)。将Option Explicit
放在脚本的开头,以检测类似的错误。
将您的代码更改为这样的代码,它应该可以完成您期望的工作:
cmd = "%comspec% /k ""netstat -an | find """ & portfile(0) & """ | find """ & _
portfile(1) & """ | awk ""{print $4}"""""
Set PSExec = objShell.Exec(cmd)
顺便说一句,您不需要两次调用find
来获取地址和端口(假设两者均引用远程主机)。只需过滤IP:port
:
cmd = "%comspec% /k ""netstat -an | find """ & portfile(0) & ":" & _
portfile(1) & """ | awk ""{print $4}"""""
Set PSExec = objShell.Exec(cmd)
正如我在上一个问题的注释中提到的那样,您也不需要使用awk
打印一列,然后阅读并比较输出。只需使用Run
方法,再添加一个find
步骤,以检查该行是否包含文本“ ESTABLISHED”,然后检查命令的退出代码。
cmd = "%comspec% /c ""netstat -an | find """ & portfile(0) & ":" & _
portfile(1) & """ | find ""ESTABLISHED"""""
rc = objShell.Run(cmd, 0, True)
If rc = 0 Then
'connection established
Else
'no established connection found
End If