用VBS检测U盘插入和弹出事件(二)

2011年01月9日   By Demon   20,069 views

鉴于很多人反映之前写的那篇在XP下无效,做了一下修改。说是修改,其实是直接复制粘贴脚本专家的代码。

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colEvents = objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceOperationEvent Within 10 Where " _
        & "TargetInstance isa 'Win32_LogicalDisk'")

Do While True
    Set objEvent = colEvents.NextEvent
    If objEvent.TargetInstance.DriveType = 2 Then 
        Select Case objEvent.Path_.Class
            Case "__InstanceCreationEvent"
                Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
                    " has been added."
            Case "__InstanceDeletionEvent"
                Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
                    " has been removed."
        End Select
    End If
Loop

参考链接:How Can I Determine When a Removable Drive Gets Connected?

用VBS实现PHP的md5_file函数

2011年01月4日   By Demon   16,922 views
Function md5_file(filename, raw_output)
    Dim HashedData, Utility, Stream
    Set HashedData = CreateObject("CAPICOM.HashedData")
    Set Utility = CreateObject("CAPICOM.Utilities")
    Set Stream = CreateObject("ADODB.Stream")
    HashedData.Algorithm = 3
    Stream.Type = 1
    Stream.Open
    Stream.LoadFromFile filename
    Do Until Stream.EOS
        HashedData.Hash Stream.Read(1024)
    Loop
    If raw_output Then
        md5_file = Utility.HexToBinary(HashedData.Value)
    Else
        md5_file = HashedData.Value
    End If
End Function

参考链接:HashedData Object

用VBS实现PHP的sha1_file函数

2011年01月3日   By Demon   9,393 views
Function sha1_file(filename, raw_output)
    Dim HashedData, Utility, Stream
    Set HashedData = CreateObject("CAPICOM.HashedData")
    Set Utility = CreateObject("CAPICOM.Utilities")
    Set Stream = CreateObject("ADODB.Stream")
    HashedData.Algorithm = 0
    Stream.Type = 1
    Stream.Open
    Stream.LoadFromFile filename
    Do Until Stream.EOS
        HashedData.Hash Stream.Read(1024)
    Loop
    If raw_output Then
        sha1_file = Utility.HexToBinary(HashedData.Value)
    Else
        sha1_file = HashedData.Value
    End If
End Function

参考链接:HashedData Object

匹配C语言风格注释的正则表达式

2011年01月2日   By Demon   18,287 views

期末复习,差不多零点才回到宿舍。打开QQ,弹出一个半年不说一句话的群,高中班级的群。上大学以后大家都很忙吧,以至于一声问候也成了奢侈。或者说,已经不是同一个世界的人了。

群消息的内容就是问C语言注释的正则表达式,果然是无事不登三宝殿。他给的代码是:

\/\*(.|[\n])*(\*\/){1}

还说程序会一直匹配到最后一个*/,弄了半个下午没弄出来,烦死了。

这种问题Google一下不就行了么:

/\*(.|[\r\n])*?\*/

还是计算机专业的,连贪婪模式和非贪婪模式都不懂。我懂,但又怎样?

参考链接:Finding Comments in Source Code Using Regular Expressions

用VBS获取Unix时间戳

2010年12月31日   By Demon   18,054 views

UNIX时间,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不包括闰秒。

VBS中没有类似C标准库中的time函数,怎么获取Unix时间戳呢?乍一看很简单:

Function UnixTime()
    UnixTime = DateDiff("s", "01/01/1970 00:00:00", Now())
End Function

一个很想当然的方法,仅仅注意到了“1970年1月1日0时0分0秒”,而忽略了“协调世界时”。

协调世界时,又称世界标准时间或世界协调时间,简称UTC,从英文“Coordinated Universal Time”而来。在中国大陆的本地时间比UTC快8小时,就会写作UTC+8。如果是在本地时间比UTC时间慢的地区,例如夏威夷的时间是比UTC时间慢10小时,就会写作UTC-10。

而VBS中的Now()函数返回的时间是包括时区的,所以获取Unix时间戳要做一些修正。

Function UnixTime()
    Set objWMIService = _
    GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem",,48)
    For Each objItem in colItems
        TimeZone = objItem.CurrentTimeZone
    Next
    UnixTime = DateDiff("s", "01/01/1970 00:00:00", Now())
    UnixTime = UnixTime - TimeZone * 60
End Function

这才是正确的写法。

参考链接:Epoch & Unix Timestamp Conversion Tools