wsh获取命令行的返回值

前言

在研究wsh如何获取网络端口相关技术时,找到了ws中的exec函数。相比run,可以获取返回的值,甚至可以实时获取,但是它也几个run没有的优势:

无法对窗体进行任何的操作。最致命的就是无法隐藏了,那么如果你单独拿出来运行的话,那个黑窗口会很尴尬。
只能单独执行命令,甚至无法用到cmd中的任何语法,逻辑运算符都不行,比如&或|。
所以还是老老实实用run吧,结果重定向到文本中去提取。当然如果你本身运行的环境就是在控制台内,且单独执行命令的话,那么exec它绝对是完美的!

js

1
2
3
4
5
6
7
8
9
10
11
12
function ExCmd() {
ws=new ActiveXObject("WScript.Shell")
ex=ws.Exec('netstat -ano')
//result = []
while (!ex.StdOut.AtEndOfStream) {
WSH.Echo(ex.StdOut.ReadLine())
//result.push(ex.StdOut.ReadLine())
}
//WSH.Echo(result.join('\n'))
//WSH.Echo(result.length)
}
ExCmd()

while的条件也可以不用!ex.StdOut.AtEndOfStream检查是否结束,可以使用ex.Status检查运行状态,但是不稳定,拿到的数据会漏掉一些。

vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
Set ws = WScript.CreateObject("WScript.Shell")
Set ex = ws.Exec("netstat -ano")
Set oStdOut = ex.StdOut
Do Until oStdOut.AtEndOfStream
strLine = oStdOut.ReadLine
WSH.Echo(strLine)
If InStr(strLine, ":" & 3389) > 0 And InStrRev(strLine, "ESTABLISHED") > 0 Then
WSH.Echo(strLine)
isOccupied = 1
'断点
Exit Do
End If
Loop

相比js,vbs的写法更加简单粗暴。可以配合if找到对应字符串后,结束获取。

参考文献

JScript: Проблема с WshScriptExec.Exec
如何使用VBS检测特定端口是否被占用
WScript.Shell对象的 run()和exec()函数使用详解