标题:小论VB "SHELL"与DOS命令技巧
取消只看楼主
三断笛
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:31
帖 子:1621
专家分:1617
注 册:2007-5-24
结帖率:37.5%
 问题点数:0 回复次数:0 
小论VB "SHELL"与DOS命令技巧

开题之前,请最好学点DOS命令,要不就没必要往下看了.

DOS这玩意儿现在用的人不多,但你可知道DOS有多强大么?

VB用SHELL调用外部应用程序相信大家都知道,,比如说关机可以在VB中写入这一行 Shell "shutdown -s -t 0"(相关参数请在DOS下打入shutdown /?查看),用这些简单的命令就可以实现VB中必须用API才能实现的功能
再给大家几个比较实用的例子:
在杀毒软件杀毒找到一个病毒文件时通常有一项功能就是"查找文件",选中查找文件后程序会启动资源管理器,并选中那个文件,VB用API实现这个功能容易吗?而现在用SHELL,一行就可以做到,如下:(假设C盘根目录下存在1.txt文件)
shell "explorer /select,c:\1.txt"
执行后程序会启动资源管理器并自动选中1.txt
再来几个,VB中关闭一个进程也要用复杂的(对初学者来说)API来实现,其实要实现关闭进程也相当简单,也只一行:
shell "taskkill /f /im explorer.exe"
这行程序会关闭explorer.exe,你将会看不到桌面和任务管理器等等,要回到原来状态请用 shell "explorer.exe"
怎么样,好玩吧?
比如说要启动控制面板只要这样一句 shell "control"
要格式化F盘只需这样一句 shell "format F:
要停止系统服务,如WorkStation服务,只需这样一行 shell "net stop workstation", vbNormalFocus
反正只在能在DOS下运行的程序,在这里也一样完全可以调用
要知道,早期的系统就全由DOS控制,windows也是从DOS上开发出来的,可想而知DOS之强大


上面只举出几个用DOS控制系统的命令,现在再说说怎样用SHELL获取系统信息了.
这里又得说到DOS的了一个不常用的功能,DOS管理命令,相信知道的人不多吧?
用DOS管道命令可以将DOS执行的结果写入文件中,,,,,,这意味着什么呢?
这就意味着我们可以读取结果文件中的内容,以获取系统参数!
比如说,要获取系统中正在运行的进程,可以这样写
shell "tasklist>>C:\1.txt"
这句把系统当前的进程列表写入到C:\1.txt中,你可以打开C盘的1.txt查看内容
然后要怎么把这里边的数据读取到VB中去呢?
这不用说吧,直接一行行读取顺序文件就是了,只是要截掉第一和第二行无效信息,这样稍家处理就可以很容易得系统中的每一个进程名,然后呢?获取了进程名当然就可以关闭进程了,关闭进程的命令就在上边

再来几个

获取系统当前网络配置信息,在DOS下我们可以用IPCONFIG/ALL来查看当前配置,所以,我们可以用这样一行命令把配置信息写入到文件中去:
shell "ipconfig/all >>C:\2.txt"
现在你可以打开C盘的2.txt看看里边的信息了,自己看吧,我不多说.
然后也只要一行行读取文件信息,文件里的信息都是很有规则的,只每一行有用的信息截取出来就得到了系统网络配置信息.

同样的,也可以用来测试与某个IP的连通状况,用PING命令,这个大家都会用吧
shell "ping >C:\3.txt">www.baidu.com>>C:\3.txt"
这一行就把连接百度的状态写入到C:\3.txt 中,你可以用VB直接读取里边的内容.

这次就只说这么一些,关于DOS命令大家多去看看,这是作为一个高手必备的知识.

另外再补充一点,VB执行程序是异步方式,也就是说在DOS命令还没来得及完全把信息写入到文件之间,VB就已经执行到下一行去了,这样会出现错误,所以还需要一个API实现同步执行DOS命令,这样就不会出错了,下面给一个网络测试实例,供大家参考:(测试信息写入在Netinfo变量里,要使用时只要直接读取就OK了)


Rem===============================同步执行=============================================
Public Const SYNCHRONIZE = &H100000
Public Const INFINITE = &HFFFFFFFF
Public Const WAIT_TIMEOUT = &H102&
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Rem ===============================网络信息===================================
Type NetInfomationt '网络信息
HostName As String '主机名
NetCard As String '网卡
PhysicalAddress As String '物理地址
DHCP As Boolean 'DHCP
IP As String 'IP
GateWay As String '网关
DNS As String 'DNS
Delay As String '延时
Comment As String
End Type
Public NetInfo As NetInfomationt
Rem =====================================完毕===============================
Rem====================================同步执行函数===================================================
Public Sub Synchronism(FileName As String)
Dim pId As Long, pHnd As Long, ret

pId = Shell(FileName, vbMinimizedNoFocus)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd <> 0 Then

Do
ret = WaitForSingleObject(pHnd, 0)
DoEvents
Loop While ret = WAIT_TIMEOUT
CloseHandle pHnd

End If
End Sub
Rem============================================================================================

Public Sub TestNet() '测试网络

'测试局域网
'此部份主要利用DOS管道命令实现测试信息输出,然后读取测试文件获得测试结果,
'用最简单的办法得到了需要API的复杂编程才能得到的数据.
Dim TestFile1 As String
Dim TestFile2 As String
Dim TestFile As String
Dim aStr As String
Dim bStr As String
On Error GoTo 100
If Dir(App.Path & "\test", vbDirectory) = "" Then MkDir App.Path & "\test"
TestFile = App.Path & "\Test\Test.bat"
TestFile1 = App.Path & "\Test\TestNet1.rmrb"
TestFile2 = App.Path & "\Test\TestNet2.rmrb"
'写入测试文件
Open TestFile For Output As #1
Print #1, "title 正在进行网络测试.........--技术支持:三断笛"
Print #1, "CLS"
Print #1, "@echo off"
Print #1, "echo DOS网络测试"
Print #1, "del " & TestFile1
Print #1, "del " & TestFile2
Print #1, "echo,"
Print #1, "echo,"
Print #1, "echo 技术支持:三断笛"
Print #1, "echo,"
Print #1, "echo,"
Print #1, "echo xxyj6450@163.com"
Print #1, "echo,"
Print #1, "echo,"
Print #1, "ipconfig/all>>" & TestFile1
Print #1, "echo 系统正在测试局域网......."
Print #1, "@title 系统正在测试局域网.....技术支持:三断笛"
Print #1, "echo,"
Print #1, "echo,"
Print #1, "echo 系统正在测试InterNet....."
Print #1, "ping www.baidu.com>>" & TestFile2
Print #1, "@title 系统正在测试Internet.....技术支持:三断笛"
Print #1, "echo,"
Print #1, "echo,"
Print #1, "echo 网络测试完毕!"
Close #1
'执行测试文件
Synchronism TestFile
'Shell TestFile, vbMinimizedNoFocus
'读取局域网测试结果
'Sleep (1000)
Open TestFile1 For Input As #2
While Not EOF(2)
Line Input #2, aStr

If InStr(1, aStr, "Host Name") > 0 Then NetInfo.HostName = Trim(Mid(aStr, 44))
If InStr(1, aStr, "Description") > 0 Then NetInfo.NetCard = Trim(Mid(aStr, 44))
If InStr(1, aStr, "Physical Address") > 0 Then NetInfo.PhysicalAddress = Trim(Mid(aStr, 44))
If InStr(1, aStr, "Dhcp Enabled") > 0 Then
If InStr(1, aStr, "No") > 0 Then NetInfo.DHCP = False Else NetInfo.DHCP = True
End If
If InStr(1, aStr, "IP Address") > 0 Then NetInfo.IP = Trim(Mid(aStr, 44))
If InStr(1, aStr, "Default Gateway") > 0 Then NetInfo.GateWay = Trim(Mid(aStr, 44))
If InStr(1, aStr, "DNS Servers") > 0 Then NetInfo.DNS = Trim(Mid(aStr, 44))
Wend
Close #2

'读取广域网测试结果
Open TestFile2 For Input As #1
Do While Not EOF(1)
Line Input #1, aStr
bStr = bStr & aStr & Chr(29) + Chr(13) + Chr(10)
If InStr(1, aStr, "Average") > 0 Then
NetInfo.Delay = Trim(Mid(aStr, 47))
Exit Do
Else
NetInfo.Delay = "网络未连通!"
End If
Loop
If NetInfo.Delay = "网络未连通!" Then
NetInfo.Comment = NetInfo.HostName & "网络测试评测及解决方案:" & Chr(29) + Chr(13) + Chr(10)
If NetInfo.NetCard = "" Then NetInfo.Comment = NetInfo.Comment & "系统没有检测到您的网卡" & Chr(29) + Chr(13) + Chr(10) & "请正确安装网卡并安装合适网卡驱动!"
If NetInfo.IP = "" Then NetInfo.Comment = NetInfo.Comment & "请检查网线是否连接正常" & Chr(29) + Chr(13) + Chr(10) & "请最好配置您的IP信息" & Chr(29) + Chr(13) + Chr(10) & "IP地址形如:192.168.0.X,请替换X为2~255间的合适值" & Chr(29) + Chr(13) + Chr(10)
If NetInfo.GateWay = "" Then NetInfo.Comment = NetInfo.Comment & "请正确设置您的网关!,形如:192.168.0.1"
If NetInfo.DHCP = False And NetInfo.IP = "" Then NetInfo.Comment = NetInfo.Comment & "您没有设置IP地址,请打开DHCP服务让系统自动获得IP地址" & Chr(29) + Chr(13) + Chr(10) & "DHCP打开方法:" & Chr(29) + Chr(13) + Chr(10) & " 1.开始>>运行>>输入services.msc,回车" _
& Chr(29) + Chr(13) + Chr(10) & " 2.找到DHCP Client,双击,点[启动]按钮,并设置启动方式为[自动]" & Chr(29) + Chr(13) + Chr(10)
If NetInfo.DNS = "" Then NetInfo.Comment = NetInfo.Comment & " 请正确设置您的DNS,可以为设为您的网关地址" & Chr(29) + Chr(13) + Chr(10)
Else
NetInfo.Comment = "您的网络是连通的!" & Chr(29) + Chr(13) + Chr(10)


If Val(NetInfo.Delay) < 40 And Val(NetInfo.Delay) > 0 Then NetInfo.Comment = NetInfo.Comment & "你的网速好快呀!"
If Val(NetInfo.Delay) > 40 And Val(NetInfo.Delay) < 80 Then NetInfo.Comment = NetInfo.Comment & "你的网速凑合着还行"
If Val(NetInfo.Delay) > 80 And Val(NetInfo.Delay) < 200 Then NetInfo.Comment = NetInfo.Comment & "您的网速有一点点慢啊....."
If Val(NetInfo.Delay) > 200 Then NetInfo.Comment = NetInfo.Comment & "您的网速比蜗牛还慢,半夜再上网吧,速度快"
End If
Close #1
End Sub

搜索更多相关主题的帖子: DOS命令 资源管理器 杀毒软件 技巧 
2007-09-20 11:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-171451-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054749 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved