如何在netstat命令中传递参数?

时间:2018-07-28 15:12:39

标签: vbscript netstat

我正在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地址和端口号的连通性均处于连接和已建立状态。

1 个答案:

答案 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
相关问题