[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创] 【连载】不得不说的VBS对象调用

前言:
  好吧,我承认我错了。。。不该学习标题党。其实之所以开此贴是为了给学习vbs的会员提供一个讨论的机会(顺便感叹一下vbs专区的冷清),让大家通过在此贴中的讨论对vbs对象调用有一个由浅入深的认识。大家知道vbs除了内置了大量的函数来实现强大的功能以处,还可以通过cretateobject方法来调用众多的windows对象,然后结合不同的事件和方法来实现对系统、网络以及其他脚本和程序的操作,从此来实现更为强大和便捷的操作和处理功能。

  本人是vbs菜多鸟一名,对于vbs的对象调用也只是略知一二,愿以本人所知来抛砖引玉,讲得不是的地方请大家予以批评指正。也请大家踊跃跟贴讨论,一起学习,共同提高。
***共同提高***

本帖最后由 batman 于 2011-5-26 16:42 编辑

fso文件系统对象:

  vbs通过调用fso对象可以方便地实现对文件夹和文件的新建、查找、读取、修改、删除以及信息操作,其调用语法为Set fso = CreateObject("scripting.filesystemobject"),这个fso只是一个变量名,你可以用任意字符串来代替,如“myobject”。下面我们就辅以代码来简要说明一下通过调用fso对象如何实现对文件夹和文件的操作:

  假如我们要在当前目录下创建一个名为test.txt的文本,并向其中写入数据“www.bathome.net”,那么可写下如下代码,并保存为test.vbs:
  1. Dim fso, vbstr
  2. vbstr = "www.bathome.net"
  3. Set fso = CreateObject("scripting.filesystemobject")
  4. fso.OpenTextFile("test.txt", 2, 1).Write vbstr
  5. Set fso = Nothing
复制代码
  双击test.vbs,就会在当前目录下新建一个test.txt文本,其中的内容为www.bathome.net。fso.OpenTextFile("test.txt", 2)中的2是表示操作的模式,常用的有三个值1、2、8,mode为1表示以读取的模式打开文本,mode为2, 1以写入的方式打开文本(如文本存在则覆盖),mode为8表示以改写的方式打开文本(紧接原文本内容后面写入)。至于后面的Write方法其实还有两种,一种Writeline方法(按行写),还有一种Writeblanklines(line)(指定写入多少行)。而相对于mode为1(读取方式),Read就有read(number)(指定读入多少个字符),Readall()方法(整版读取)和Readline(按行读取)方法。下面我们以代码一一示例:
  1. Dim fso, vbstr
  2. vbstr = "www.bathome.net"
  3. Set fso = CreateObject("scripting.filesystemobject")
  4. fso.OpenTextFile("test.txt", 2).Write vbstr
  5. MsgBox fso.OpenTextFile("test.txt", 1).Read("3")
  6. MsgBox fso.OpenTextFile("test.txt", 1).Readall()
  7. MsgBox fso.OpenTextFile("test.txt", 1).Readline()
  8. Set fso = Nothing
复制代码
  保存为test.vbs并运行会依次显示“www”,“www.bathome.net”,“www.bathome.net”信息,对于内容只有一行的文本readall和readline的内容肯定是一样的。在这里特别指出readline一般是与skipline(相当于批中的skip)结合在一起的,如下面的代码为新建有10行内容的test.txt,并读取其3-6行的内容:
  1. Dim fso, vbstr
  2. For i = 1 To 10
  3.   vbstr = vbstr & "www.bathome.net " & i & vbCrLf
  4. Next
  5. Set fso = CreateObject("scripting.filesystemobject")
  6. fso.OpenTextFile("test.txt", 2).Write vbstr
  7. Dim oread, vbvar
  8. Set oread = fso.OpenTextFile("test.txt", 1)
  9. For i = 1 To 2
  10.   oread.SkipLine()
  11. Next
  12. For i = 1 To 4
  13.   vbvar = vbvar & oread.ReadLine() & vbCrLf
  14. Next
  15. MsgBox vbvar
  16. oread.Close
  17. Set oread = Nothing
  18. Set fso = Nothing
复制代码
  这种skip方法个人觉得比较麻烦,还不如用readall然后用split函数分割再去除前面的分割部分。好了,接着看代码:
  1. Dim fso, vbstr, vbvar
  2. vbstr = "www.bathome.net"
  3. vbvar = "the best bbs of batcherweb"
  4. Set fso = CreateObject("scripting.filesystemobject")
  5. fso.OpenTextFile("test.txt", 2).Write vbstr
  6. fso.OpenTextFile("test.txt", 8).Write vbvar
  7. Set fso = Nothing
复制代码
  保存为test.vbs并运行,会在当前目录生成test.txt并写入内容“www.bathome.netthe best bbs of batcherweb”,两句首尾相接没有了换行,这显然不是我们想要的,怎么解决呢?有两种方法:1、将wirte vbstr改为write vbstr & vbcrlf强制加上回车换行符,2、将write全改为wirteline。
  上面所讲的全是针对ansi的操作,那要怎么实现对unicode写入操作呢?其实fso新建文本的方法并不是fso.OpenTextFile,而是fso.CreateTextFile,这个方法可以创建ansi文本也可以创建unicode文本,下面我们就用代码分别创建一个ansi文本和unicode文本,并分别写入“www.bat.home”数据:
  1. Dim fso, vbstr
  2. vbstr = "www.bathome.net"
  3. Set fso = CreateObject("scripting.filesystemobject")
  4. fso.CreateTextFile("test.txt", 1, 0).Write vbstr
  5. fso.CreateTextFile("test1.txt", 1, 1).Write vbstr
  6. Set fso = Nothing
复制代码
  保存为test.vbs并运行,会在当前目录下生成test.txt(ansi)和test1.txt(unicode),你查看两个文本的大小就会发现test1.txt是test.txt大小的两倍,只有unicode编码格式下的文本才能接受unicode字符的写入,在此就不展开也不加以示例了。注意,以上所有的代码都是运行在当前目录下,如果要对指定目录进行文件读写操作,则应加上其绝对或相对路径。
  上面所讲的全是fso对于文本的操作,那么对于文件夹的操作呢?别急,我们继续往下来。先看代码:
  1. Dim fso
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. If Not fso.FolderExists("temp") Then fso.CreateFolder("temp")
  4. Set fso = Nothing
复制代码
  上面代码的意思是如果在当前目录下没有发现temp文件夹则新建temp文件夹,在这里我们用到fso.FolderExists(对应还有fso.fileExists)和fso.CreateFolder(对应的文件创建在上面已经讲过了)两种方法,其中fso.FolderExists是查找文件夹,fso.CreateFolder是创建文件夹。那么我们要查找当前文件夹所有的文件又该如何做呢?请看代码:
  1. Dim fso, vbstr
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. Set ws = CreateObject("wscript.shell")
  4. For Each file In fso.GetFolder(ws.CurrentDirectory).Files
  5.   vbstr = vbstr & file & vbCrLf
  6. Next
  7. MsgBox vbstr
  8. Set fso = Nothing
复制代码
  虽然还没有讲到wscript.shell脚本对象,大家提前预习下吧,其CurrentDirectory方法就是获取当前路径的。大家运行代码可以看出当前文件夹下的所有文件及其路径都被列了出来。那么我们要列出文件的指定信息又要如何做呢,下面以一个文件为例来一一表叙:
  1. Dim fso
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. fso.OpenTextFile("my_new_test.txt", 2, 1).Write "www.bathome.net"
  4. Set oget = fso.GetFile("my_new_test.txt")
  5. MsgBox oget.Name & " 文件名"
  6. MsgBox oget.ShortName & " 文件短名"
  7. MsgBox fso.GetExtensionName("my_new_test.txt") & " 文件后缀名"
  8. MsgBox oget.Size & " 文件大小"
  9. MsgBox oget.Type & " 文件类型"
  10. MsgBox oget.Path & " 文件路径"
  11. MsgBox oget.ShortPath & " 文件短路径"
  12. MsgBox oget.ParentFolder & " 文件所在目录"
  13. MsgBox oget.Drive & " 文件所在盘符"
  14. MsgBox oget.DateCreated & " 文件合创建时间"
  15. MsgBox oget.DateLastModified & " 文件最后一次修改时间"
  16. MsgBox oget.DateLastAccessed & " 文件最后一次访问时间"
  17. Set fso = Nothing
复制代码
  那么我们要把上面建立的这些文件和文件夹全部删除掉,又要使用什么方法呢?同时要把移动、复制、重命名文件又是什么方法呢?下面为大家一一说明。fso.DeleteFile(删除文件)、fso.DeleteFolder(删除文件夹)、fso.CopyFile(复制文件)、fso.CopyFolder(复制文件夹)、fso.MoveFile(移动文件)、fso.MoveFolder(移动文件夹),要指出的是fso没有重命名功能,但是我们可以先移动文件或文件夹为其它名字,再移回来就可以达到重命名原文件或文件夹的目的了。接下来就用代码来做简单演示:
  1. Dim fso
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. Set ws = CreateObject("wscript.shell")
  4. If Not fso.FolderExists("temp") Then fso.CreateFolder("temp")
  5. fso.OpenTextFile("test.txt", 2, 1).Write "www.bathome.net"
  6. fso.CopyFile "test.txt", "temp/new.txt"
  7. fso.MoveFile "temp/new.txt", ws.CurrentDirectory & "\"
  8. MsgBox "ok"
  9. fso.DeleteFile "new.txt"
  10. fso.DeleteFile "test.txt"
  11. fso.DeleteFolder "temp"
  12. Set fso = Nothing
复制代码
  运行上面的代码在msgbox前就会实现一系列的创建、复制、移动动作,在msgbox后就会实现对文件和文件夹的删除。好了,鉴于本人的水平暂时只能对fso文件系统对象做如上简要说明,本人在论坛写过一个vbs全盘搜索文件的代码,大家也可以看看http://www.bathome.net/viewthrea ... hlight=%C8%AB%C5%CC,欢迎批评指教。
***共同提高***

TOP

本帖最后由 batman 于 2011-5-26 21:14 编辑

wscript.shell对象:
   
    wscript.shell对象的用法极为复杂,其对象创建命令为Set ws = CreateObject("wscript.shell"),由于本人水平实在有限,只在这里跟大家讲讲常用的ws.SendKeys、ws.CreateShortcut、ws.CurrentDirectory、ws.Popup、ws.RegDelete、ws.RegRead、ws.RegWrite、ws.Run几种方法了,也只能是简单讲讲,还望谅解。

    sendkeys方法其实很简单,下面就用代码来演示演示:
  1. Dim fso, ws, vbstr
  2. vbstr = "0123456789"
  3. Set fso = CreateObject("scripting.filesystemobject")
  4. fso.OpenTextFile "test.txt", 2, 1
  5. Set ws = CreateObject("wscript.shell")
  6. ws.Run "test.txt"
  7. WScript.Sleep 200
  8. For i = 1 To Len(vbstr)
  9.   WScript.Sleep 200
  10.   ws.SendKeys Mid(vbstr, i, 1)
  11. Next
  12. WScript.Sleep 2000
  13. ws.Run "cmd /c taskkill /f /im notepad.exe", 0, 1
  14. Set ws = Nothing
  15. fso.DeleteFile "test.txt"
  16. Set fso = Nothing
复制代码
保存为test.vbs运行,就会弹出一个文本,然后依次在上面写下“0123456789”这10个数字,这就是sendkeys的作用,实际上senkeys作用不大,特别是因为输入法的干扰(所以我用的是输出数字),导致基本上没有用,只在某些特定的情况下迫不得已才使用它,大家了解就可以了。

    CreateShortcut方法是用来创建快捷方式的,它即可以创建指向文件目录的快捷方式.lnk,也可以创建指向url的快捷方式.url,如下面的代码:
  1. Dim ws, ourl, olnk
  2. Set ws = CreateObject("wscript.shell")
  3. Set ourl = ws.CreateShortcut("bathome.url")
  4. ourl.targetpath = "http://www.bathome.net"
  5. ourl.save
  6. Set ourl = Nothing
  7. Set olnk = ws.CreateShortcut("系统文件夹.lnk")
  8. olnk.targetpath = "c:\windows\system32"
  9. olnk.save
  10. Set olnk = Nothing
  11. Set ws = Nothing
复制代码
运行后当前目录下会多出一个指向批处理之家主页的快捷方式以及指向系统文件夹的快捷方式。

    CurrentDirectory是最简单的,就是表示当前目录,这个在前面的fso中已经说过了,只是大家要注意还有一个重要的路径wscript.path,这个路径是指的脚本运行路径,从下面的代码中就可以看出来:
  1. Dim ws
  2. Set ws = CreateObject("wscript.shell")
  3. MsgBox "脚本运行路径 " & WScript.Path
  4. MsgBox "脚本所在路径 " & ws.CurrentDirectory
  5. Set ws = Nothing
复制代码
Popup方法是vbs中唯一延时关闭显示窗口的方法,像wscript.echo和msgbox都可以显示信息窗口,但是必须点击后才能关闭,而popup则可以设定延时多少秒后关闭弹窗:
  1. Dim ws
  2. Set ws = CreateObject("wscript.shell")
  3. ws.Popup "www.bathome.net", 5, "此窗口将于5秒后关闭"
  4. Set ws = Nothing
复制代码
RegDelete、RegRead、RegWrite这三个方法都是针对于注册表的操作,和批处理操作注册表没有什么区别,同时还没有批方便,在这里就略过不讲了。
   
    最后讲一讲run方法,单纯的run实际相当于批中的start,但是由于run中的属性所致,使得vbs可以神鬼不知(夸张了)地运行其它程序,利用这一特性,我们就可以无声无息地隐藏运行批处理,但其实这个隐藏运行并不是真正意义上的后台运行,它只是没有前台弹窗和提示罢了,在进程管理器中我们仍然可以捕捉到被vbs启动的程序,下面用代码来演示这一过程:
  1. Dim ws, fso, vbstr
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = "start http://www.bathome.net" & vbCrLf & "echo bathome" & vbCrLf & "ping /n 3 127.1>nul"
  4. fso.OpenTextFile("temp.bat", 2, 1).Write vbstr
  5. Set fso = Nothing
  6. Set ws = CreateObject("wscript.shell")
  7. ws.Run "temp.bat", 0, 1
  8. Set ws = Nothing
复制代码
这段代码先是在当前目录生成一个temp.bat的批处理文件,然后用run方法隐藏运行了这个bat由此打开批处理之家的主页,在这个过程中我们是看不到dos窗口的黑窗的,而如果我们单独点击这个temp.bat,你就会看到不但有黑窗出现,窗口还会显示出很多运行中的信息(因为没有@echo off)。大家注意这一句ws.Run "temp.bat", 0, 1,后面有两个参数,第一个为运行模式,值为0则隐藏运行,值为1则是正常运行;第二个为是否等待运行的返回值,值为1则是等待,值为0则不等待。

    对了突然记起一个很重要的东东了,就插在这里讲了。大家知道批中的call start都可以传递参数,我们一样可以将参数传给vbs,这就不得不要提到WScript.Arguments了。实际上vbs把传递给它的参数当成一个数组WScript.Arguments(),第一个参数就是WScript.Arguments(0),然后依此类推,下面我们用代码来说明:
  1. For Each Argument In WScript.Arguments
  2.   MsgBox argument
  3. next
复制代码
保存为test.vbs,然后在cmd中运行test.vbs www bat home net,就会依次出现www bat home net的输出框。这就是传递参数给vbs的过程,至于具体如何使用这些参数,我就不在此罗索了。

   我相信通过以上的说明,大家对wscript.shell对象都有一个大概的认识了,关键还是多用多想,才会有收获和提高。
***共同提高***

TOP

本帖最后由 batman 于 2011-6-27 10:07 编辑

excel.application对象:

  excel.application是针对office excel操作的对象,由于office excel在工作中的普遍应用,所以学好这一对象调用对我们日常的工作是极为有帮助的。同时,本人将在本篇中根据自身的经验结合excel的基本函数公式对vbs调用excel.application对象进行较为详细的说明,也请大家予以批评指正。

  excel.application对象的创建命令是Set oexcel = CreateObject("excel.application"),当我们成功创建oexel对象后就可以使用其下的组件(方法)对excel文件进行创建以及读写操作了。首先我们来认识下两个组件:oexcel.Caption和oexcel.Visible,oexcel.Caption即是工作表的窗口title,这个可以自己任意修改的,oexcel.Visible是设置工作表窗口是否可见,true表示可见false表示不可见。下面我们就来创建一个新的工作表吧:
  1. Set oexcel = CreateObject("excel.application")
  2. oexcel.Visible = True '设置工作表窗口可见
  3. oexcel.Caption = "我的工作表" '设置工作表窗口标题
  4. oexcel.Workbooks.Add '创建新工作表
  5. oexcel.Cells(1, 6).value = "www.bathome.net" '设置工作表默认sheet1的第一行第6列单元格值(写入数据)
  6. oexcel.ActiveWorkbook.saved = true '必须这样写,否则将出现book1的另存窗口
  7. Set ws = CreateObject("wscript.shell")
  8. oexcel.Save(ws.CurrentDirectory & "\test.xls") '这个必须加上当前目录的路径,否则会存到workbook的默认templates文件夹下
  9. oexcel.Workbooks.Close
  10. Set ws = Nothing
  11. MsgBox "ok"
  12. oexcel.Quit
  13. Set oexcel = Nothing
复制代码
  现在我们知道了如何用vbs来创建一个新的工作表并向其中指定列写入指定内容的方法,那么我们如何来读取一个已有工作表中的所有内容呢?其实这涉及到对工作表有效行列数的获取,一般情况下我们是用两个do loop循环来实现,如下:
  1. Dim EXCEL, ExStr, Rows, Columns, SHELL, Path
  2. Set SHELL = CreateObject("Wscript.Shell")
  3. Path = SHELL.CurrentDirectory & "\"
  4. Set SHELL = Nothing
  5. Set EXCEL = CreateObject("Excel.ApplicaTion")
  6. EXCEL.Visible =
  7. EXCEL.Workbooks.Open(Path & "a.xls")
  8. EXCEL.Worksheets(2).Activate
  9. Rows = 1 : Columns = 1
  10. Do Until EXCEL.Cells(Rows, 1).Value = ""
  11.   Rows = Rows + 1
  12. Loop
  13. Do Until  EXCEL.Cells(1, Columns).Value = ""
  14.   Columns = Columns +  1
  15. Loop
  16. For i = 1 To Rows
  17.   For j = 1 To Columns
  18.     ExStr = ExStr & EXCEL.Cells(i, j).Value & vbTab
  19.   Next
  20.   ExStr = ExStr & vbCrLf
  21. Next
  22. EXCEL.Quit
  23. Set EXCEL = Nothing
  24. MsgBox ExStr
复制代码
  以上代码实现的是读取当前目录下a.xls工作表sheet(2)中的所有单元格内容。大家注意使用这种获取行列数的方法,要注意工作表的第一列和第一行有效范围内不能出现空值,否则就会获取不正确,如我们将a.xls中的第一行第一列数据置空,那么exstr的值也就只会是这一个空值,它再也不会继续向下向后获取了。好了下面给出本人实际中使用的一个工作表分表代码,将要分开的工作表的分表字段置于最后一列,然后将工作表拖放到vbs上就可以了:
  1. If WScript.Arguments(0) = "" Then WScript.Quit
  2. Set oexcel = CreateObject("excel.application")
  3. Set fso = CreateObject("scripting.filesystemobject")
  4. name = fso.GetFile(WScript.Arguments(0)).name
  5. ext = fso.GetExtensionName(WScript.Arguments(0))
  6. path = fso.GetFile(WScript.Arguments(0)).parentfolder & "\" & Replace(name, "." & ext, "_")
  7. oexcel.Visible = False
  8. oexcel.Workbooks.Open(WScript.Arguments(0))
  9. oexcel.ActiveWorkbook.sheets(1).activate
  10. For Each str In oexcel.ActiveSheet.rows(1).value
  11.   If str <> "" Then
  12.     oco = oco + 1
  13.     head = head & oexcel.Cells(1, oco).value & vbTab
  14.   End If
  15. Next
  16. arr = Split(head, vbTab)
  17. For i = o To UBound(arr) - 2
  18.   str = str & arr(i) & vbTab
  19. Next
  20. head = str
  21. For Each str In oexcel.ActiveSheet.columns(1).value
  22.   If str <> "" Then oro = oro + 1
  23. Next
  24. For i = 2 To oro
  25.   file = oexcel.Cells(i, oco).value & ".xls"
  26.   If Not fso.FileExists(path & file) Then fso.CreateTextFile(path & file, True, False).Write head & vbCrLf
  27.   For j = 1 To oco - 1
  28.     vbstr = vbstr & oexcel.Cells(i, j) & vbTab
  29.   Next
  30.   fso.OpenTextFile(path & file, 8, True).Write vbstr & vbCrLf : vbstr = ""
  31. Next
  32. oexcel.Workbooks.Close
  33. Set oexcel = Nothing
  34. MsgBox "ok"
复制代码
  
  上面所讲的是用vbs读取整个工作表的内容,那么我们要读取工作表指定行列间的内容又要如何写代码呢?我相信大家只要读懂了上面的代码,那么这个是很容易的了,所以就在这里留给大家思考,大家也可以在下面跟贴给出自己的代码。
  excel对象的功能是非常强大的,其各种方法也是非常复杂的(如设置区域的字体字号颜色等。。。),因为在论坛有关于这些方法的专贴,本人就不在此一一详述了,在此且给出一段本人用vbs调用excel写的文字特效的链接http://www.bathome.net/thread-12672-1-1.html,相信你看了后会有收获的。
***共同提高***

TOP

本帖最后由 batman 于 2011-6-27 10:16 编辑

ie对象:
***共同提高***

TOP

占楼编辑。。。
***共同提高***

TOP

占楼编辑。。。
***共同提高***

TOP

本帖最后由 myzam 于 2011-5-26 11:47 编辑

就完了?真够短小精干的了。
调用vbs对象,应该要学会从注册表中查找对象。

TOP

待我学完所有的bat系统自带外部命令就转战vb,连同vbs一起学。

TOP

就完了?真够短小精干的了。
调用vbs对象,应该要学会从注册表中查找对象。
myzam 发表于 2011-5-26 11:45

请教一下,请问注册表中的对象有没有具体的键值或者格式呢?

TOP

10# zm900612

-----------------------
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{B0000301-BFDE-11D3-981C-00004CAD9063}]
@="Hyon.Tray Control"
******
[HKEY_CLASSES_ROOT\CLSID\{B0000301-BFDE-11D3-981C-00004CAD9063}\ProgID]
@="Hyon.Tray.1"
******
[HKEY_CLASSES_ROOT\CLSID\{B0000301-BFDE-11D3-981C-00004CAD9063}\Version]
@="1.0"
[HKEY_CLASSES_ROOT\CLSID\{B0000301-BFDE-11D3-981C-00004CAD9063}\VersionIndependentProgID]
@="Hyon.Tray"
-------------------------

可以用 Set ht = CreateObject("Hyon.Tray") 创建默认版本的对象,或者用 Set ht = CreateObject("Hyon.Tray.1")  创建1.0版本的对象。

TOP

坛子里好像没有vbs调用com对象的大全。。还有具体com对象的方法和属性呀?

TOP

回复 12# nppel


   用 exescope.exe
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

期望IE对象那楼早点编辑,楼主写的好。

TOP

现在有无成果啊

TOP

返回列表