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

[问题求助] vbs include 问题

本帖最后由 caspar 于 2012-11-22 17:32 编辑

本来vbs是不能像C那样 include 但是通过ExecuteGlobal 就能实现调用自定义类和函数

但是一些奇怪的问题就来了...

因为要多次调用正则来获取文字, 自身懒, 想写少点代码, 就写了一个RegExp的Function 那以后要再用到的时候 直接include
RegExp的代码:
  1. Public Function GetMatches(ByVal patrn, ByVal strng, ByRef MatchesCount, ByRef SubMatchesCount, ByVal regExIgnoreCase, ByVal regExGlobal)
  2.     Dim regEx, Match, Matches            ' 建立变量。
  3.     Dim arrMatch()
  4.     Set regEx = New RegExp               ' 建立正则表达式。
  5.     regEx.Pattern = patrn                ' 设置模式。
  6.     IF regExIgnoreCase="" Then           ' 设置不区分字符大小写。
  7.        regEx.IgnoreCase = True   
  8.     ELSE
  9.        regEx.IgnoreCase = regExIgnoreCase
  10.     End IF                          
  11.     IF regExGlobal="" Then
  12.        regEx.Global = True
  13.     ELSE
  14.        regEx.Global = regExGlobal
  15.     End IF                               ' 设置全局可用性。
  16.    
  17.     Set Matches = regEx.Execute(strng)   ' 执行搜索。
  18.    
  19.     MatchesCount=Matches.Count           ' 获取匹配数量
  20.     SubMatchesCount=Matches(0).SubMatches.Count
  21.     ReDim arrMatch(MatchesCount)
  22.     ReDim arrMatch(Matches.count,SubMatchesCount)
  23.     n=1     
  24.     For Each Match in Matches           ' 遍历匹配集合。
  25.         arrMatch(n,0)=Match.Value
  26.         For t=1 to Match.SubMatches.Count
  27.             arrMatch(n,t)=Match.submatches(t-1)
  28.         next
  29.         n=n+1
  30.      Next
  31.      
  32.      Set regEx = Nothing
  33.      GetMatches = arrMatch             ' 返回匹配矩阵
  34. End Function
复制代码
但问题来了...include之后 调用这个函数...
例如
  1. Dim arrMatches()
  2. arrMatches=GetMatches(patrn,str,mcount,smcount,true,true)
复制代码
就会提示类型不匹配...有高手知道这是为什么么...?

把这个代码黏贴到程序里头 然后就能像C那样 include "程序"
可以自定义类 子程序 函数等....
caspar 发表于 2012-11-22 18:46



    学习了。

TOP

回复  caspar


    好办法…
目测 match 好像不能又 dim 又用在 for each 中
CrLf 发表于 2012-11-23 09:39



    咕~~(╯﹏╰)b.....改改.....

TOP

不明白,子函数Sub本来就可以调用的啊

跟 include ExecuteGlobal 有什么关系?
czjt1234 发表于 2012-11-23 08:21



    很是神奇.... 现在改成
  1. Public Sub GetMatches(ByRef arrMatch(), ByRef patrn, ByVal strng, ByRef MatchesCount, ByRef SubMatchesCount, ByVal regExIgnoreCase, ByVal regExGlobal)
复制代码
传递数组指针过去 就能返回了....

TOP

回复 8# caspar


    好办法…
目测 match 好像不能又 dim 又用在 for each 中

TOP

不明白,子函数Sub本来就可以调用的啊

跟 include ExecuteGlobal 有什么关系?

QQ 20147578

TOP

通过子程序 ByRef 数组解决了....

TOP

高手教教我怎么include吧
Demon 发表于 2012-11-22 18:10


把这个代码黏贴到程序里头 然后就能像C那样 include "程序"
可以自定义类 子程序 函数等....
  1. Sub Include(sInstFile)
  2.     On Error Resume Next
  3.     Dim oFSO, f, s
  4.     Set oFSO = CreateObject("Scripting.FileSystemObject")
  5.     If oFSO.FileExists(sInstFile) Then
  6.         Set f = oFSO.OpenTextFile(sInstFile)
  7.         s = f.ReadAll
  8.         f.Close
  9.         ExecuteGlobal s
  10.     End If
  11.     Set oFSO = Nothing
  12.     Set f = Nothing
  13. End Sub
复制代码

TOP

本帖最后由 caspar 于 2012-11-22 18:48 编辑
返回一个数组啊,不行吧

数组赋值不是这样赋的吧

我是新手啊,大概这么猜下,不确定

要不用join函 ...
czjt1234 发表于 2012-11-22 18:07



    函数返回值可以有几种方式的...可以返回一个集合 数组 字串 或者通过定义ByRef在调用函数时候把变量指针传递给函数 在函数内处理时候 直接改变父程序的变量内容
   又或者用一个更不好的方式...就是全局变量...但是这个比较蛋疼...尽量避免...

   但是因为vb的语法不严谨...所以很多时候类型会很模糊...

TOP

回复 3# czjt1234


    那样就更烦了...因为Matches的不确定性...后期处理字符串的时候太多种可能了....如果这样 不如直接每次New RegExp...

TOP

回复 2# zz100001


  不用ByRef的话 那要获取匹配数 只能通过全局变量了吧....- -!

TOP

高手教教我怎么include吧

TOP

返回一个数组啊,不行吧

数组赋值不是这样赋的吧

我是新手啊,大概这么猜下,不确定

要不用join函数连接成一个字符串,返回后再处理?

QQ 20147578

TOP

高手告诉你,问题在于,你的学问太渊博了。。。。
不需要管变量类型,把太细节的东西扔掉就好了,你要写成
  1. Dim arrMatches
  2. arrMatches=GetMatches(patrn,str,mcount,smcount,true,true)
复制代码

TOP

返回列表