VBScript 检测网络连接是否正常

某次维护测试需要配置脚本检测网络是否连通,正常手动检测网络是否连通有两个最为常见的办法:一是ping一个主机;二是打开某知名网站。所以脚本检测也顺着这两个思路进行。

关于ping的VBScript实现有如下代码可供参考:

Function Ping(strTarget)
  Dim objShell, objExec, strPingResults
  Set objShell = CreateObject("WScript.Shell")
  Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
  strPingResults = LCase(objExec.StdOut.ReadAll)
  If InStr(strPingResults, "reply from") Then 
    'WScript.Echo VbCrLf & strTarget & " responded to ping."
    Ping = True
  Else
    'WScript.Echo VbCrLf & strTarget & " did not respond to ping."
    Ping = False
  End If
  Set objExec = Nothing
  Set objShell = Nothing
End Function

继续阅读

VBA/VBScript提取Word(*.doc)文件中包含的图片(照片)

要处理的人事简历表是典型的Word文档,其中一人一份doc,里面包含有个人的照片,如果要把里面的照片复制出来就比较麻烦了,一般手动的做法是选择文件另存为,保存类型选择“网页(*.htm; *.html)”,这样就会另存为网页形式,同时会有个以文件名开头,以.files结尾的文件夹,点击进去就可以看到Word里面嵌入的所有资源,包含所需要的图片资源。

值得注意的是该文件夹里同一张图片正常会有两个副本,其中一张图片文件体积较大,另一张图片文件体积较小,显而易见较小体积的文件是Word自动创建的缩略图,在绝大多数情况下我们可能仅仅需要原始的插入图片,那么选择较大体积的图片文件即可,好在我要处理的人事简历表只有员工的一张照片,那么另存为网页后的文件夹也仅仅只有两张图片,一张原始图片,一张缩略图,这两张图片可以通过大小区分。

继续阅读

彻底防止Windows 7/8/8.1升级更新到Windows 10

去年7月写过一篇文章讲解如何去除扰人的获取Windows 10的图标,那时候微软也只是推送了获取Windows 10的提示,具体安装Windows 10与否还是有显著的选项让用户自己选择的。

虽然通过先前的方法确实抑制了升级Windows 10的提示,怎奈微软接下来连续放大招推送升级补丁,并且不怎么明显的“诱使”用户升级系统,比如我遇到的微软健康助手提示升级,并且默认勾选同意的坑。其实我不是说Windows 10不好,就是较为反感微软的推送方式,就好像你去商场老是有业务员跟着你,不停向你推荐某某产品好等等,而且因为大部分客户电脑上一些业务系统在Windows 10下存在各种兼容问题,就有客户反应因为不小心升级Windows 10导致业务软件不能正常运行最后只有重新安装老系统(其实对于误安装有办法直接恢复到老系统,方法附本文后)

继续阅读

CMD或BAT批处理/VBScript批量复制安装字体文件脚本

根据新系统要求,经常要部署一些原来系统里没有的字体,原先我为了图省事经常会要求用户手动安装字体文件,虽然Windows的易用性做得相当不错,但是仍然要照顾一些不会安装字体的人,其实把这些字体打包进安装包更为方便,不过我觉得总不能每有新字体都要搞个安装包那么麻烦吧。更重要的是仍然有人会问我字体怎么安装,以前清一色的Windows XP系统,我倒也方便,直接告知打开控制面板找到字体文件夹,把要安装的字体拖进去即可;现在有Windows 7还是Windows 8等各种版本Windows系统,对于安装字体这个小小操作我也开始分情况讨论了。

使用特殊文件夹或者Desktop.ini方法

使用特殊文件夹方法

Windows保留了一种特殊文件夹引用,比如在Windows XP的情况下,新建一个文件夹,然后在文件夹重命名后缀.{645FF040-5081-101B-9F08-00AA002F954E}(注意以点号分隔),然后这个文件夹就变成了回收站的一个引用,当我们点击进去的时候实际上进去的是回收站。

继续阅读

VBA/Python/VBScript导出PowerPoint(PPT)幻灯片为JPG图片或者纯文本TXT

最近需要对一堆幻灯片进行整理,为了便于检索,决定做一个全文检索系统,整个系统依旧考虑采用Python技术构建,不得不承认Python的开发效率挺高,我采用Flask+Whoosh一个下午就搭建好搜索平台了。今天把一些细节和大家分享一下,首先是幻灯片不同于Word文档,对于幻灯片的检索我是这样考虑的:对于每一张幻灯片分别保存一张图片和纯文本文字,然后让全文检索引擎检索文本,向最终用户提供纯文本和图片化的幻灯片。这里涉及的技术细节是如何将幻灯片导出为图片格式,当然这里还得请出ActiveX/COM对象VBA技术,对于幻灯片的控制采用的ProgID为PowerPoint.Application

这里同样的采用PyWin32Dispatch或者DispatchEx方法:

from win32com.client import DispatchEx
 
powerpoint = DispatchEx("PowerPoint.Application")
powerpoint.Visible       = True    # 为了便于查阅PPT工作情况,这里设置为可见
powerpoint.DisplayAlerts = False   # 为了使工作不中断,忽略可能的弹出警告

继续阅读

WScript/VBScript命令行参数使用srvany.exe创建自定义服务

之前写过一篇文章介绍srvany.exe这个小工具的,今天有网友反映能否使用命令行方式创建基于srvany.exe的Windows服务,我想到之前编写的SrvanyUI软件没有命令参数直接调用的功能,本来想完善一下SrvanyUI这个软件的,苦于最近较忙,于是先用VBScript凑合写着一个命令行控制的脚本srvany.vbs,其中用到了RestartService子过程来自Rob van der Woude,在此表示感谢!

基本的思路很简单,就是先创建srvany.exe为可执行映像的NT系统服务,然后在利用注册表修改其间的配置参数,最后再启动服务。

先把srvany.vbs的代码贴在这儿,具体的使用方法稍后附上。

继续阅读

WScript/VBScript实现ZIP文件的压缩或解压(ZipCompressor)

用了一段时间的Python后,发现VBScript竟然写得不是那么顺手,由于要实现脚本的压缩或者解压,本来觉得用Python来写说不定会方便些,可是想到这个脚本程序主要面对的是非编程人员,总不能要求他们也去安装Python吧,更何况大多数用户对于安装新软件会有抵触情绪。

不过一定要解决这个问题,也不是不可能的,我们可以把Python解释器和库文件打包一起发送给用户,比如可以通过py2exe这个实用工具。

好了,扯多了,今天讲的是使用WScript/VBScript来实现这个功能,Windows系统自带WScript/VBScript环境,妥妥的:-)

通常情况下系统会自带有压缩解压工具,最典型的就是makecab命令,以及可以使用其图形化界面iexpress,打开“开始”菜单,在“运行”对话框中输入iexpress,即可打开“IExpress Wizard”。当然配合makecab压缩命令使用的还有expand解压命令,关于这些命令的详细使用网上有很多我就不多说了,这里简单举个例子。

继续阅读

ASP/VBScript模拟实现PHP extract()函数将字典集合转换为对象

写过PHP的都知道,其有个extract()非常方便,可以便捷的将字典转换为变量,当然到ASP中则要受限很多,特别是VBScript脚本,本文叙述的就是一种转换的思路,可以实现类似的功能。

首先需要我之前公布的一个类DynamicObject(最新版本的),大家可以移步这里找到相应的代码和说明。

了解了DynamicObject类和其工作原理后,下面我就直接提供ASP版本的extract代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
'
' ASP/VBScript Dictionary extract
' Author: WangYe
' For more information please visit
'     //wangye.org/
' This code is distributed under the BSD license
'
' collection 集合或者字典,可以通过For Each访问的
'            Request.Form 或者 Request.QueryString
' specified  指定必须存在的属性,假如该属性不存在,将自动创建一个
' prefix     每个属性的前缀修饰
' callback   对于集合或者字典的每个元素(key-value)的值进行函数调用
'            函数原型:
'            Function filter(key, value)
'                filter = value
'            End If
'            最终值将以该函数返回的值为准
' 
Function extract(collection, ByVal specified, prefix, callback)
    Dim VarName, VarValue, DynObj, searchKey
    specified = "," & Replace(specified, " ", "") & ","
 
    Set DynObj = New DynamicObject
    For Each key In collection
        searchKey = "," & key & ","
        If InStr(1, specified, searchKey, 1)>0 Then
            specified = Replace(specified, searchKey, "")
            If Left(specified, 1) <> "," Then
                specified = "," & specified
            End If
            If Right(specified, 1) <> "," Then
                specified = specified & ","
            End If
        End If
 
        VarName = prefix & key
 
        VarValue = collection(key)
        If callback<>"" Then
            VarValue = GetRef(callback)(key, VarValue)
        End If
 
        DynObj.add VarName, VarValue, PROPERTY_ACCESS_READONLY
	Next
 
    specified_array = Split(specified, ",")
    Dim i
    For i = LBound(specified_array) To UBound(specified_array)
        If specified_array(i)<>"" Then
            DynObj.add prefix & specified_array(i), "", _
		PROPERTY_ACCESS_READONLY
        End If
    Next
    Set extract = DynObj.GetObject()
End Function

继续阅读

ASP/VBScript动态创建属性对象的工厂类(DynamicObject)

最近整理ASP/VBScript代码,发现过去的一个ASP实现的MVC框架,可惜是个半成品,效率也成问题,不过发现里面有些我写的代码,感觉还稍稍可以拿出来见人,于是今天作此文以记之。

说是ASP,其实和VBScript也脱不了干系,VBScript语言传承于Visual Basic,VB的语法灵活度已经不尽如人意了,VBS作为其子集可想而知。神马反射、自省等先进的技术,微软在.NET中才引入。作为被抛弃的技术,也不奢望微软能够提供支持,于是顽固守旧的程序员只有绞尽脑汁的去模仿实现一些类似的功能。

好吧,我承认很长一段时间我就是顽固守旧派中的一员,今天介绍的就是其中的一项功能,动态创建一个属性对象,属性对象姑且这么称呼,也就是说动态创建的对象只包含属性(Properties)。

继续阅读

Excel列编号(序号A、B、C…AA、AB…)英文字母字符生成算法备忘

近期很忙,博客也不怎么更新了,这里记录一个Excel扩展项目中的列编号生成算法实现。在VBA中,Excel的行可以是1、2、3、4、5…,但是Excel的列编号却是形如A、B、C…AA、AB…BA这样的编号模式,我期望将1、2、3、4、5转换为对应的Excel列编号,但对于我这种不太喜欢钻研算法的来说,确实有点棘手。

不过硬着头皮写了一段,并且也勉强能用,代码分享如下:

/**
*
*  buffer 字符缓冲区,用来存储A、B..AA..BB这样的转换结果
*  cch    字符缓冲区容量,最多可以容下字符数
*  num    表示要转换的数值数据
**/
char *TranslateToColumnName(char *buffer, int cch, int num)
{
    const int factor = 26;
    int f1 = (num) / (factor);
    int f2 = (num+1) - (f1) * factor;
    memset(buffer, 0, cch * sizeof(char));
 
    if (f1 == 0) {
        buffer[0] = 'A'+(f2-1);
        buffer[1] = '\0';
    } else {
        buffer[0] = 'A'+(f1-1);
        buffer[1] = 'A'+(f2-1);
    }
    return buffer;
}

有一天我在网上看到了现成的算法《如何将 Excel 列号转换为字母字符》,竟然还是微软官方提供的,看来我是重复造了一个轮子,微软的代码如下(VB实现):

继续阅读