找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28249|回复: 13

[问题求助] vbs include 问题

[复制链接]
发表于 2012-11-22 17:31:25 | 显示全部楼层 |阅读模式
本帖最后由 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)
复制代码
就会提示类型不匹配...有高手知道这是为什么么...?
发表于 2012-11-22 18:04:04 | 显示全部楼层
高手告诉你,问题在于,你的学问太渊博了。。。。
不需要管变量类型,把太细节的东西扔掉就好了,你要写成
  1. Dim arrMatches
  2. arrMatches=GetMatches(patrn,str,mcount,smcount,true,true)
复制代码
发表于 2012-11-22 18:07:14 | 显示全部楼层
返回一个数组啊,不行吧

数组赋值不是这样赋的吧

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

要不用join函数连接成一个字符串,返回后再处理?
发表于 2012-11-22 18:10:14 | 显示全部楼层
高手教教我怎么include吧
 楼主| 发表于 2012-11-22 18:39:14 | 显示全部楼层
回复 2# zz100001


  不用ByRef的话 那要获取匹配数 只能通过全局变量了吧....- -!
 楼主| 发表于 2012-11-22 18:40:48 | 显示全部楼层
回复 3# czjt1234


    那样就更烦了...因为Matches的不确定性...后期处理字符串的时候太多种可能了....如果这样 不如直接每次New RegExp...
 楼主| 发表于 2012-11-22 18:44:45 | 显示全部楼层
本帖最后由 caspar 于 2012-11-22 18:48 编辑
返回一个数组啊,不行吧

数组赋值不是这样赋的吧

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

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



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

   但是因为vb的语法不严谨...所以很多时候类型会很模糊...
 楼主| 发表于 2012-11-22 18:46:54 | 显示全部楼层
高手教教我怎么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
复制代码
 楼主| 发表于 2012-11-22 19:57:17 | 显示全部楼层
通过子程序 ByRef 数组解决了....
发表于 2012-11-23 08:21:45 | 显示全部楼层
不明白,子函数Sub本来就可以调用的啊

跟 include ExecuteGlobal 有什么关系?
发表于 2012-11-23 09:39:20 | 显示全部楼层
回复 8# caspar


    好办法…
目测 match 好像不能又 dim 又用在 for each 中
 楼主| 发表于 2012-11-23 11:39:44 | 显示全部楼层
不明白,子函数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)
复制代码
传递数组指针过去 就能返回了....
 楼主| 发表于 2012-11-23 11:40:22 | 显示全部楼层
回复  caspar


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



    咕~~(╯﹏╰)b.....改改.....
发表于 2012-11-23 11:51:17 | 显示全部楼层
把这个代码黏贴到程序里头 然后就能像C那样 include "程序"
可以自定义类 子程序 函数等....
caspar 发表于 2012-11-22 18:46



    学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 11:44 , Processed in 0.022064 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表