“程序设计”目录存档

VBS调用WMI搜索文件

2010年10月7日,星期四

如果你想用递归搜索我也没办法。下面的程序搜索电脑上所有的MP3文件。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colFiles = objWMIService. _
    ExecQuery("Select * from CIM_DataFile where Extension = 'mp3'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

参考链接:WMI Tasks: Files and Folders

在C语言程序中使用cURL库(libcurl)

2010年10月4日,星期一

cURL本身就是用C语言写的,当然可以在C语言中使用。但是理论和实践还是有一定距离的,以前研究了好几天才研究出怎样正确的使用libcurl的C语言API,曾经也分享过,不过重建博客的时候没有备份数据库。再写一次吧。

#define CURL_STATICLIB  //必须在包含curl.h前定义

#include <stdio.h>
#include "curl/curl.h"
//以下四项是必须的
#pragma comment ( lib, "libcurl.lib" )
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "winmm.lib" )
#pragma comment ( lib, "wldap32.lib" )

int main(void)
{
	CURL *curl;
	CURLcode res;
	curl = curl_easy_init();
	if(curl)
	{
		curl_easy_setopt(curl, CURLOPT_URL, 
                           "http://ipv6.google.com");
		res = curl_easy_perform(curl);
		curl_easy_cleanup(curl);
	}
	return 0;
}

Visual C++ 6.0下编译通过。附上我编译的libcurl.lib:

[download id=48]

参考链接:libcurl – C API

验证IPv4地址的正则表达式

2010年10月2日,星期六

今天看了一下《Beginning Regular Expressions》,第六章谈到了用正则表达式验证IPv4地址,记下来,以后也许会用到。

^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[09][0-9]|[1-9][0-9]|[0-9])$

用VBS枚举素数(质数)

2010年10月1日,星期五

看到标题你一定会不屑一顾,枚举质数谁不会?

For i = 1 To 100
	For j = 2 To i
		If i Mod j = 0 Then Exit For
	Next
	If j = i Then WScript.Echo i
Next

几行代码就能搞定,如此简单。那就看看下面这个程序吧!

Set regex = New RegExp
regex.Pattern = "^1?$|^(11+?)\1+$"
For i = 1 To 100
	If Not regex.Test(String(i,"1")) Then
		WScript.Echo i
	End If
Next

用正则表达式判断质数,神一样的人物。

参考链接:

  1. 检查素数的正则表达式
  2. 用 JS 枚举质数

VBS实现“多线程”

2010年09月30日,星期四

今天有人发邮件问我一个问题:

想请教一下VBS中INPUTBOX函数能否超时关闭?
如果可以的话,应该如何超时关闭输入框? 万分感谢

乍一看这是不可能实现的,因为InputBox函数本身没有超时关闭的参数,而且程序会一直等待InputBox返回才继续运行,后面的语句不可能在InputBox返回之前执行。

如果VBS能实现高级语言的多线程的话……只可惜VBS不可能实现多线程,但是可以用setTimeout方法模拟“多线程”。

Dim IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"
Set window = IE.Document.parentWindow
id = window.setTimeout(GetRef("on_timeout"),3000,"VBScript")
name = InputBox("Please enter your name","InputBox Timeout")
window.clearTimeout id
If name <> "" Then MsgBox "Hello," & name
IE.Quit

'By Demon
'https://demon.tw

Sub on_timeout()
    Dim WshShell
    set WshShell = CreateObject("wscript.Shell")
    WshShell.SendKeys "{ESC}"
End Sub

用setTimeout方法设定3秒超时,3秒后用SendKeys方法发送ESC键结束InputBox。当然,用SendKeys是很不靠谱的,我一般很少用SendKeys方法,因为它做了太多的假设,万一InputBox不是激活窗口呢?这里只是为了程序简单而用了SendKeys,可以换成结束脚本本身。

同理,想在VBS中实现VB中的Timer事件的话可以用setInterval方法,我就不写例子了,自己看文档。

参考链接:setTimeout Method (window, Window Constructor)