无痕 发表于 2007-8-8 01:47:00

[原创] !将vbscript移植到lisp!

本帖最后由 作者 于 2007-8-19 16:51:37 编辑


                                       将vbscript移植到lisp
更新到v2.2版本:完善数组返回值.完善对wscript. 的判断 . ret支持表,字符,符号格式.
姊妹版: 将jscript移植到lisp :http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62386


前段时间研究了下正则表达式,对vbs有了更进一步的理解。于是一鼓作气,搞了个将vbs程序移植到lisp的函数。
大家知道,网络上vbscript的程序是很多的,功能也很强,从获取系统信息,到读写网络,编辑网页,甚至操控windows系统底层(因此成了木马的载体)
而这些,现在相当部分(因为没有经过全面严格测试,所以只能说相当部分)的程序代码,可以在cad中直接拷贝使用。只需要按如下说明进行极少量的转换即可。;| (xxvbs str)=移植vbs程序的函数 ---------------by 梁雄啸.2007.7
函数: xxvbs
格式: (xxvbs str)
参数: str = vbs语句.
      说明: 1.可将多行vbs程序拷贝移植,注意: " 应用 \"替代, \ 号应用 \\ 替代.
            2.如果vbs内容过长,可分成几段来移植,但是被调用的子函数必须写在前面.即把调用子函数的部分放到最后.有回车的地方要保留,如:
            (setq str "
            ****移植的语句****
            "
            )
      ret = vbs语句中返回值变量.支持表,字符,符号格式.
            如: '(a "b") , "b" , 'a 返回: 执行vbs,返回vbs返回值.
版本: v2.2 数组返回值函数除错,可很好地支持多维数组.
   v2 完善数组返回值.完善对wscript. 的判断 . ret支持表,字符,符号格式.
      v1 完成基本移植功能.支持多行
实例:
(xxvbs "a=10+3*5 \n b=a-2" "b") ;;返回: 23
|;
函数下载
http://dreamskylxx.ys168.com/


v2.2版本实例:
补充实例:
1. (版本v2)
(setq str1 "Dim A \n A = Array(10,20,30,\"test\") \n B = \"测试1\"")
(setq str2 "Dim A : B = \"测试2\" : A = Array(10,20,30,B) : ")
(xxvbs str1 'a);;返回: (10 20 30 "test")
(xxvbs str2 "a") ;;返回: (10 20 30 "测试2")
(xxvbs str1 '(b "A")) ;;返回: ("测试1" (10 20 30 "test"))
(xxvbs str2 '(a ("b" a)));; 返回: ((10 20 30 "测试2") ("测试2" (10 20 30 "测试2")))
2. (版本v2)
(setq str "Dim a(9) : for i = 0 TO 9 : a(i) = i : NEXT")
(xxvbs str "a");; -> (0 1 2 3 4 5 6 7 8 9)
3. (版本v2)
(setq str "dim a : b = array(\"a\",\"B\") : a = array(array(1,2),b)" ret "a")
(xxvbs str ret) ;;返回: ((1 2) ("a" "B"))
(xxvbs str '(a (b "a(0)"))) ;;返回: (((1 2) ("a" "B")) (("a" "B") (1 2)))




4.(版本v2.2)
(setq str "
Function   GetValue()   
          Dim   arrX(3 , 3 , 2)
          Dim   i,j,k   
          For   i = 0 To 3   
               For j = 0 To 3
                  For k = 0 To 2
                     arrX (i , j , k) = i * j + k
                  Next
               Next
          Next   
          GetValue = arrX   
End   Function"
)
(xxvbs str "getvalue")
;;返回: (((0 1 2) (0 1 2) (0 1 2) (0 1 2)) ((0 1 2) (1 2 3) (2 3 4) (3 4 5))
((0 1 2) (2 3 4) (4 5 6) (6 7 8)) ((0 1 2) (3 4 5) (6 7 8) (9 10 11)))

;| v1版本:
测试1:
;; 本例建立一个快捷方式.
(setq str "
         set WshShell = wscript.CreateObject(\"WScript.Shell\")
         strDesktop = WshShell.SpecialFolders(\"Desktop\")
         set oShellLink = WshShell.CreateShortcut (strDesktop & \"\\Shortcut Script.lnk\")
         oShellLink.TargetPath = wscript.ScriptFullName
         oShellLink.WindowStyle = 1
         oShellLink.Hotkey = \"CTRL+SHIFT+F\" \n
         oShellLink.IconLocation = \"notepad.exe, 0\"
         oShellLink.Description = \"Shortcut Script\"
         oShellLink.WorkingDirectory = strDesktop
         oShellLink.Save "
       )
(xxvbs str "") -> 成功建立快捷方式!


测试2:
;;本例测试条件语句,循环语句,并返回 a 的值.
(setq str "
      dim a
      a = 1
      for i=1 to 5
      a=a*i-a+1
      next
      if a < 100 then msgbox \"a=\" & a & \"<100\" else msgbox \"a=\" & a & \">100\"
      "
)
(xxvbs str "a")

;; 测试3:
谁说lisp调用vbs不能有条件语句的
(setq str "
      dim A,B,C
      ANS = \"谁说lisp调用vbs不能有条件语句的\"
      a = 1
      for i=1 to 5
      a=a*i-a+1
      next
      if a > 100 then
      A = A + 1 : B = A^A : C = A + B
      ELSE
      A = A: B = A : C = A + B
      END IF
      msgbox \"a=\" & a & \" b=\" & b & \" c=\" & c & vbcr & ans
      "
)
(xxvbs str "C")

;; 将两个连续字符替换为一个.
(setq str "
Dim ss, re, rv
ss = inputbox(\"将两个连续字符替换为一个,输入测试字符:\")
Set re = New RegExp
re.Pattern = \"(.+)\\1\"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,\"$1\")
")
(xxvbs str "rv")
;; 将两个连续单词替换为一个(单词间以空格分隔)
(setq str "
Dim ss, re, rv
ss = \"Is is the cost of of gasoline going up up?.\"
Set re = New RegExp
re.Pattern = \"\\b(.+) \\1\\b\"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,\"$1\")
")
(xxvbs str "rv") -> "Is the cost of gasoline going up?."
|;

无痕 发表于 2007-8-8 01:58:00

本帖最后由 作者 于 2007-8-15 21:08:27 编辑 <br /><br /> <p><font color="#ff0033" size="3">最新v2.1版下载地址:</font></p><p></p><p>&nbsp;</p><p>函数应用</p><p>秒杀本地打印机列表</p><p><a href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62103">http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62103</a></p><div class="htmlcode" id="mc34362" style="BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 5px; BORDER-LEFT: #ccc 1px solid; BORDER-BOTTOM: #ccc 1px solid;"><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> str "<br/>Set WshNetwork = WScript.CreateObject<font color="#ff0000">(</font>\<font color="#ff00ff">"WScript.Network\"</font><font color="#ff0000">)</font><br/>Set oPrinters = WshNetwork.EnumPrinterConnections<br/>ret = \<font color="#ff00ff">"\"</font><br/>For i = <font color="#008000">0</font> to oPrinters.Count <font color="#008000">-</font> 1 Step <font color="#008000">2</font><br/>ret = ret &amp; chr<font color="#ff0000">(</font><font color="#008000">34</font><font color="#ff0000">)</font> &amp; oPrinters.Item<font color="#ff0000">(</font>i+1<font color="#ff0000">)</font> &amp; chr<font color="#ff0000">(</font><font color="#008000">34</font><font color="#ff0000">)</font><br/>Next<br/>ret =&nbsp;&nbsp;\<font color="#ff00ff">"<font color="#ff0000">(</font>\"</font> &amp; ret &amp;&nbsp;&nbsp;\<font color="#ff00ff">"<font color="#ff0000">)</font>\"</font><br/>&nbsp;&nbsp;<br/>"<font color="#ff0000">)</font><br/><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/read.htm" target="_black"><font color="#0000ff">read</font></a><br/>&nbsp;&nbsp;<font color="#ff0000">(</font>xxvbs str <font color="#ff00ff">"ret"</font><font color="#ff0000">)</font><font color="#ff0000">)</font> -&gt; <font color="#ff0000">(</font><font color="#ff00ff">"hp deskjet 695c series"</font><br/>&nbsp;&nbsp;<font color="#ff00ff">"Canon BJC-6500 <font color="#ff0000">(</font>BJRSTR<font color="#ff0000">)</font>"</font><font color="#ff0000">)</font><br/>&nbsp;&nbsp;<br/></div><p></p><p></p><p></p><div class="codebar" style="TEXT-ALIGN: right;"><a href="javascript:copycode('mc19489')"><font color="#000000">[复制代码到剪贴板]</font></a></div><div class="htmlcode" id="mc19489" style="BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 5px; BORDER-LEFT: #ccc 1px solid; BORDER-BOTTOM: #ccc 1px solid;"><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/setq.htm" target="_black"><font color="#0000ff">setq</font></a> str "<br/>strComputer = \<font color="#ff00ff">".\"</font><br/>ret = \<font color="#ff00ff">"\"</font><br/>Set objWMIService = GetObject<font color="#ff0000">(</font>\<font color="#ff00ff">"winmgmts:\"</font> &amp; \<font color="#ff00ff">"{impersonationLevel=impersonate}!\\\\\"</font> &amp; strComputer &amp; \<font color="#ff00ff">"\\root\\cimv2\"</font><font color="#ff0000">)</font><br/>Set colInstalledPrinters =&nbsp;&nbsp;objWMIService.ExecQuery <font color="#ff0000">(</font>\<font color="#ff00ff">"Select * from Win32_Printer\"</font><font color="#ff0000">)</font><br/>For Each objPrinter in colInstalledPrinters <br/>&nbsp;&nbsp;&nbsp;&nbsp; ret = ret &amp; chr<font color="#ff0000">(</font><font color="#008000">34</font><font color="#ff0000">)</font> &amp; objPrinter.Name &amp; chr<font color="#ff0000">(</font><font color="#008000">34</font><font color="#ff0000">)</font><br/>&nbsp;&nbsp;<br/>Next<br/>ret =&nbsp;&nbsp;\<font color="#ff00ff">"<font color="#ff0000">(</font>\"</font> &amp; ret &amp;&nbsp;&nbsp;\<font color="#ff00ff">"<font color="#ff0000">)</font>\"</font><br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<font color="#ff0000">)</font><br/><font color="#ff0000">(</font><a href="http://www.mjtd.com/object/autolisp/read.htm" target="_black"><font color="#0000ff">read</font></a><br/>&nbsp;&nbsp;<font color="#ff0000">(</font>xxvbs str <font color="#ff00ff">"ret"</font><font color="#ff0000">)</font><font color="#ff0000">)</font> -&gt; <font color="#ff0000">(</font><font color="#ff00ff">"hp deskjet 695c series"</font><br/>&nbsp;&nbsp;<font color="#ff00ff">"Canon BJC-6500 <font color="#ff0000">(</font>BJRSTR<font color="#ff0000">)</font>"</font><font color="#ff0000">)</font><br/>&nbsp;&nbsp;<br/></div><p></p>

无痕 发表于 2007-8-8 02:54:00


;;取得本机IP(setq str "
strComputer = \".\"
Set objWMIService = GetObject(\"winmgmts:\\\\\" & strComputer & \"\\root\\cimv2\")
Set IPConfigSet = objWMIService.ExecQuery(\"Select IPAddress from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE\")
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For Each strAddress in IPConfig.IPAddress
msgbox strAddress
Next
End If
Next
")
(xxvbs str "");2 取得本机计算机名(setq str "
      strComputer = \".\"
Set objWMIService = GetObject(\"winmgmts:\\\\\" & strComputer & \"\\root\\cimv2\")
Set colComputers = objWMIService.ExecQuery(\"Select * from Win32_ComputerSystem\")
For Each objComputer in colComputers
msgbox objComputer.Name
Next
")
(xxvbs str "");12 检索本地共享(setq str "
      ret = \"\"
      strComputer = \".\"
Set objWMIService = GetObject(\"winmgmts:\\\\\" & strComputer & \"\\root\\cimv2\")
Set colShares = objWMIService.ExecQuery(\"Select * from Win32_Share\")
For each objShare in colShares
ret = ret & \"Name: \" & objShare.Name & \"Path: \" & objShare.Path & \"Type: \" & objShare.Type & vbcrlf
Next
msgbox ret
")
(xxvbs str "ret");13 脚本检索一个文件夹下.txt文件 (本例为c:\下所有txt文件)(setq str "
Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")
Set colFiles = objWMIService.ExecQuery(\"SELECT * FROM CIM_DataFile WHERE Path = '\\\\' AND Drive = 'C:' AND Extension = 'txt'\")
msgbox \"Number of .txt files found: \" & colFiles.Count
for each aa in colFiles
NL=NL & vbcrlf & aa.name
next
msgbox NL
")
(xxvbs str "")

无痕 发表于 2007-8-8 10:17:00

;; 判断是否是网址.....(setq str1 "
            function isemail(strng)
            isemail = false
            dim regex, match
            set regex = new regexp
            regex.Pattern = \"(http://)?([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?\"
            regex.ignorecase = true
            set match = regex.execute(strng)
            if match.count then isemail = true
            end function
            msgbox isemail(inputbox(\"输入网址:\"))
            "
      )
      (xxvbs str1 "") ;; 测试输入: http://www.mjtd.com

;; 正则表达式应用. ok
(setq str "            
function regexptest(patrn, strng)
dim regex, match, matches   ' 建立变量。
set regex = new regexp   ' 建立正则表达式。
regex.pattern = patrn   ' 设置模式。
regex.ignorecase = true   ' 设置是否区分字符大小写。
regex.global = true   ' 设置全局可用性。
set matches = regex.execute(strng)' 执行搜索。
for each match in matches   ' 遍历匹配集合。
retstr = retstr & \"match found at position \" & match.firstindex & \". match value is '\"
retstr = retstr & match.value & \"'.\" & vbcrlf
next
regexptest = retstr
end function
msgbox(regexptest(\"is.\", \"is1 is2 is3 is4\"))
")
(xxvbs str "");;通过WMI对象获得系统中运行的的进程ok!(setq str "
Function Enum1()
    Set WMI = GetObject(\"WinMgmts:\")
    Set objs = WMI.InstancesOf(\"Win32_Process\")
    For Each obj In objs
      Enum1 = Enum1 & obj.Description & Chr(13) & Chr(10)
    Next
End Function
msgbox (enum1)
")
(xxvbs str "")

zml84 发表于 2007-8-8 10:56:00

让lisp与vbs联姻,实在强大!

killer9806 发表于 2007-8-8 12:33:00

<p>技术的革新,太强了</p>

飞诗(fsxm) 发表于 2007-8-8 21:00:00

<p><font id="Sa_7115584">我以前在QQ群中发布过,也可以</font></p><p><font id="Sa_7115584">到 <a href="http://fsxm.ys168.com/">http://fsxm.ys168.com/</a>中 下载 fsxm-vbs.fas&nbsp;1K</font></p><p>可以以<font color="#ff0000">标准的lisp函数格式(不是字符串)</font>调用绝大多数VBS函数!</p><p>比如:</p><p>(fsxm-vbs '(msgbox "测试"))</p><p>(fsxm-vbs '(abs -10))</p><p>(fsxm-vbs '(split "123 456 789"))</p><p>(fsxm-vbs '(GetObject "WinMgmts:"))</p><p>(fsxm-vbs '(rnd))</p><p>变量请用list如:</p><p>(fsxm-vbs (list 'cstr pi))</p><p>不用多说了吧!就是这么简单!</p>

无痕 发表于 2007-8-8 21:24:00

本帖最后由 作者 于 2007-8-9 2:04:26 编辑 <br /><br /> <p>欢迎fsxm一起探讨。先补几个实例</p><p><font color="#0000dd">;检索计算机上安装的光驱:</font><br/>(setq str "<br/>ret = \"\"<br/>strComputer = \".\"<br/>Set objSWbemLocator = CreateObject(\"WbemScripting.SWbemLocator\")<br/>Set objSWbemServices = objSWbemLocator.ConnectServer<br/>Set colItems = objSWbemServices.ExecQuery(\"Select * from Win32_CDROMDrive\")<br/>For Each objItem in colItems<br/>&nbsp;&nbsp; ret = ret &amp;&nbsp; \"光盘驱动器的类型: \" &amp; objItem.Caption &amp; vblf<br/>&nbsp;&nbsp; ret = ret &amp;&nbsp; \"盘符是: \" &amp; objItem.Id<br/>Next<br/>msgbox ret")<br/>(xxvbs str "ret")<br/>;-&gt; "光盘驱动器的类型: SAMSUNG CDRW/DVD SM-332F\n盘符是: K:光盘驱动器的类型: AXV CD/DVD-ROM SCSI CdRom Device\n盘符是: L:"</p><p><font color="#0000ff">;; 获得CPU的序列号。</font><br/>(setq str "<br/>Set objSWbemObject = GetObject(\"winmgmts:Win32_Processor.DeviceID='cpu0'\")<br/>ret = objSWbemObject.ProcessorId<br/>msgbox \"首枚CPU序列号:\" &amp; ret<br/>")<br/>(xxvbs str "ret")</p><p><font color="#2c00dd">;;使用 WMI 和 VBScript 检索操作系统信息<br/></font>(setq str "<br/>strComputer = \".\"<br/>Set objWMIService = GetObject(\"winmgmts:\\\\\" &amp; strComputer)<br/>Set colOperatingSystems = objWMIService.InstancesOf(\"Win32_OperatingSystem\")<br/>For Each objOperatingSystem In colOperatingSystems<br/>msgbox \"Name:&nbsp; \" &amp; objOperatingSystem.Name&nbsp;&nbsp; &amp; vbCrLf &amp; \"Caption:&nbsp; \" &amp; objOperatingSystem.Caption &amp; vbCrLf &amp; \"CurrentTimeZone: \" &amp; objOperatingSystem.CurrentTimeZone &amp; vbCrLf &amp; \"LastBootUpTime:&nbsp; \" &amp; objOperatingSystem.LastBootUpTime&nbsp; &amp; vbCrLf &amp;&nbsp; \"LocalDateTime:&nbsp;&nbsp; \" &amp; objOperatingSystem.LocalDateTime&nbsp;&nbsp; &amp; vbCrLf &amp;&nbsp; \"Locale:&nbsp;&nbsp; \" &amp; objOperatingSystem.Locale &amp; vbCrLf &amp;&nbsp; \"Manufacturer:&nbsp;&nbsp;&nbsp; \" &amp; objOperatingSystem.Manufacturer &amp; vbCrLf &amp;&nbsp; \"OSType:&nbsp;&nbsp; \" &amp; objOperatingSystem. OSType&nbsp; &amp; vbCrLf &amp;&nbsp; \"Version:&nbsp;&nbsp;&nbsp;&nbsp; \" &amp; objOperatingSystem.Version &amp; vbCrLf &amp; \"Service Pack:&nbsp;&nbsp;&nbsp; \" &amp; objOperatingSystem.ServicePackMajorVersion&nbsp; &amp;&nbsp; \".\" &amp; objOperatingSystem.ServicePackMinorVersion &amp; vbCrLf &amp;&nbsp; \"Windows Directory: \" &amp; objOperatingSystem.WindowsDirectory<br/>Next<br/>")<br/>(xxvbs str "")</p><p><font color="#3000ee">;;使用 WMI 和 VBScript 检索在 root\cimv2 命名空间中注册的 Win32 提供程序</font><br/>(setq str "strComputer = \".\"<br/>ret = \"\"<br/>Set objWMIService = GetObject(\"winmgmts:\\\\\" &amp; strComputer &amp; \"<a href="file://\\root\\cimv2\">\\root\\cimv2\</a>")<br/>Set colWin32Providers = objWMIService.InstancesOf(\"__Win32Provider\")<br/>For Each objWin32Provider In colWin32Providers<br/>ret = ret &amp; objWin32Provider.Name &amp; vblf<br/>Next<br/>msgbox ret")<br/>(xxvbs str "ret")</p><p><font color="#0000ff">;;很多GUI工具(比如流光)启动时,有一个logo页,显示版权等信息。我们用ie对象也可以模拟一个出来<br/></font>(defun c:logo()<br/>(setq str "<br/>set wscript = createobject(\"wscript.shell\")<br/>set ie = wscript.createobject(\"internetexplorer.application\") <br/>ie.fullscreen = 1 <br/>ie.width = 300 <br/>ie.height = 150 <br/>ie.navigate \"about\"&amp;\":blank\" <br/>ie.left = fix((ie.document.parentwindow.screen.availwidth-ie.width)/2) <br/>ie.top = fix((ie.document.parentwindow.screen.availheight-ie.height)/2)<br/>str = \"&lt;body bgcolor&nbsp; = skyblue scroll = no&gt;&lt;br&gt;&lt;br&gt;\"&amp;\"&lt;h2 align = center&gt;这是一个Logo&lt;/h2&gt;&lt;/body&gt;\"<br/>str = &amp; str &amp;<br/>ie.document.write <br/>ie.visible = 1 <br/>wscript.sleep 5000 <br/>ie.quit ")<br/>(xxvbs str "ret"))</p><p><font color="#0000dd">;;在ie调用系统颜色选择对话</font><br/>(setq str <br/>"set ie = createobject(\"internetexplorer.application\")<br/>set wscript = createobject(\"wscript.shell\")<br/>ie.navigate \"about:blank\"<br/>do until ie.readystate = 4 : wscript.sleep 25 : loop<br/>set doc = ie.document<br/>set body = doc.body<br/>set win = doc.parentwindow<br/>body.innerhtml = \"&lt;OBJECT id=dlg CLASSID='clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b'&gt;&lt;/OBJECT&gt;\"<br/>body.innertext = doc.getElementById(\"dlg\").choosecolordlg<br/>win.clipboarddata.setdata \"text\", body.innertext<br/>ie.quit ")<br/>(xxvbs str "ret")</p><p></p>

无痕 发表于 2007-8-8 22:05:00

本帖最后由 作者 于 2007-8-8 22:13:30 编辑 <br /><br /> <p><span lang="EN-US"><font face="宋体" color="#000000" size="3">欢迎fsxm一起来探讨。我在昨天发的</font></span></p><p><span lang="EN-US"><strong>vbs</strong><strong>进行字符串表达式求值 </strong></span><a href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62105">http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62105</a></p><p>也是调用vbs函数的。fsxm老弟更进一步,做成函数调用格式了。至于哪种用起来方便,就由大家去选择了。</p><p>不过移植和调用vbs还是不一样。诚然,vbs其实都可以通过调用不同的vbs函数改写。之所以有移植的想法,是懒。因为看到网上好多的vbs程序,太多了,一想到要改写,就心烦,重复劳动太多,而且还有比较重要的一点是,光调用vbs函数还不够,还要能使用vbs的结构语句,比如 for语句if语句,才能发挥其威力。移植的话就算不太懂编程的,也可以自己依葫芦画瓢diy一个比较强的函数,只要从网上找一个这样的vbs源码,稍微改装就可以(千万别用来黑明经啊:P)。比如2~4楼的实例,如果通过调用函数的方式改编,不知道要多久,而这些实例,我都是从网上搜索拷贝粘贴来的,3分钟就出一个。</p><p>我移植的想法就是这样,一切因为懒,而移植是一种方便的(傻瓜的,某种程度上也可以说是高效的)方式:)</p><p></p><p></p>

mccad 发表于 2007-8-9 18:19:00

靠,这么强的功能,以后大家都不用写程序了,网上粘粘就可以了。
页: [1] 2 3 4 5 6 7 8
查看完整版本: [原创] !将vbscript移植到lisp!