希望这里能成为我工作成长过程的积累。。

发布新日志

  • VbsSample(01)

    2008-07-23 09:32:00

    '*********************************
    '@funcname: ProcessExist
    '@brief: 判定进程列表中是否有某个进程
    '@param: sProcessName    进程名
    '*********************************
    Function ProcessExist(sProcessName)
     Dim ws
     ProcessExist = False
     Set ws = Wscrīpt.CreateObject("wscrīpt.shell")
     For each proc in GetObject("winmgmts:").instancesof("win32_process")
      If UCase(proc.Name) = UCase(sProcessName) Then
       ProcessExist = True
       Exit For
      End If
     Next
     Set ws = Nothing
    End Function

    '*********************************
    '@funcname: SendKey
    '@brief: 向系统发送键盘键
    '@param: nKey    键盘按键
    '*********************************
    Function SendKey(nKey)
        Dim oWshShell
        Set ōWshShell =CreateObject("Wscrīpt.Shell")
        oWshShell.SendKeys nKey
        Wait(1)
        Set ōWshShell = Nothing
    End Function

    '*********************************
    '@funcname: ReadReg
    '@brief:读取注册表的某一键值
    '@param: sRegPath  注册表路径
    '*********************************
    Function ReadReg(sRegPath)
        Dim oRegistry
        Set ōRegistry = CreateObject("Wscrīpt.Shell")
        ReadReg=oRegistry.RegRead(sRegPath)
        Set ōRegistry = Nothing
    End Function

  • 禁用&启动网卡

    2008-07-23 09:31:16

    Const ssfCONTROLS = 3 
    sConnectionName = "本地连接"   '可改成需要控制的连接名称,如"无线网络连接"等 
    sEnableVerb = "启用(&A)" 
    sDisableVerb = "停用(&B)"    '2003系统中应为 "禁用(&B)" 
    set shellApp = createobject("shell.application") 
    set ōControlPanel = shellApp.Namespace(ssfCONTROLS) 
    set ōNetConnections = nothing 
    for each folderitem in oControlPanel.items 
     if folderitem.name   = "网络连接" then 
         set ōNetConnections = folderitem.getfolder: exit for 
     end if 
    next 
    if oNetConnections is nothing then 
     msgbox "未找到网络连接文件夹" 
     wscrīpt.quit 
    end if 
    set ōLanConnection = nothing 
    for each folderitem in oNetConnections.items 
     if lcase(folderitem.name)   = lcase(sConnectionName) then 
         set ōLanConnection = folderitem: exit for 
     end if 
    next 
    if oLanConnection is nothing then 
     msgbox "未找到 '" & sConnectionName & "' item" 
     wscrīpt.quit 
    end if 
    bEnabled = true 
    set ōEnableVerb = nothing 
    set ōDisableVerb = nothing 
    s = "Verbs: " & vbcrlf 
    for each verb in oLanConnection.verbs 
     s = s & vbcrlf & verb.name 
     if verb.name = sEnableVerb then  
         set ōEnableVerb = verb   
         bEnabled = false 
     end if 
     if verb.name = sDisableVerb then  
         set ōDisableVerb = verb   
     end if 
    next 
    if bEnabled then 
     oDisableVerb.DoIt
    else 
     oEnableVerb.DoIt 
    end if 
    wscrīpt.sleep 400
  • Excel相关操作

    2008-07-23 09:30:35

    直接调用Excel中的函数的方法,示例如下:

      源码:
    close;
    <%
    Set ōExcel= CreateObject("excel.application")
    oExcel.Visible = True  'Excel是否可视,若赋值为True则可视,但速度会慢得多
    oExcel.Workbo感谢对我们的支持~s.Add
    Set ōSheet = oExcel.Workbo感谢对我们的支持~s(1).Worksheets("sheet1")
    oSheet.Activate
      oSheet.Cells(1, 1) = 1
      oSheet.Cells(1, 2) = 2
      oSheet.Cells(1, 3) = "=SUM(A1:B1)"
      oSheet.Cells(1, 4) = "=AVERAGE(A1:B1)"
    Set ōExcel = Nothing

    %>
    VBS控制Excel的一些常见方法:

    (一) 使用动态创建的方法

    '首先创建 Excel 对象,使用ComObj:
    oExcel = CreateObject( "Excel.Application" )

    1) 显示当前窗口:
    oExcel.Visible = True

    2) 更改 Excel 标题栏:
    oExcel.Caption = "应用程序调用 Microsoft Excel"

    3) 添加新工作簿:
    oExcel.WorkBo感谢对我们的支持~s.Add

    4) 打开已存在的工作簿:
    oExcel.WorkBo感谢对我们的支持~s.Open( "C:\Excel\Demo.xls" )

    5) 设置第2个工作表为活动工作表:
    oExcel.WorkSheets(2).Activate

    oExcel.WorksSheets( "Sheet2" ).Activate

    6) 给单元格赋值:
    oExcel.Cells(1,4).Value = "第一行第四列"

    7) 设置指定列的宽度(单位:字符个数),以第一列为例:
    oExcel.ActiveSheet.Columns(1).ColumnsWidth = 5

    8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
    oExcel.ActiveSheet.Rows(2).RowHeight = 1/0.035 ' 1厘米

    9) 在第8行之前插入分页符:
    oExcel.WorkSheets(1).Rows(8).PageBreak = 1

    10) 在第8列之前删除分页符:
    oExcel.ActiveSheet.Columns(4).PageBreak = 0

    11) 指定边框线宽度:
    oExcel.ActiveSheet.Range( "B3:D4" ).Borders(2).Weight = 3
    1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / )

    12) 清除第一行第四列单元格公式:
    oExcel.ActiveSheet.Cells(1,4).ClearContents

    13) 设置第一行字体属性:
    oExcel.ActiveSheet.Rows(1).Font.Name = "隶书"
    oExcel.ActiveSheet.Rows(1).Font.Color = clBlue
    oExcel.ActiveSheet.Rows(1).Font.Bold = True
    oExcel.ActiveSheet.Rows(1).Font.UnderLine = True

    14) 进行页面设置:

    a.页眉:
    oExcel.ActiveSheet.PageSetup.CenterHeader = "报表演示"
    b.页脚:
    oExcel.ActiveSheet.PageSetup.CenterFooter = "第&P页"
    c.页眉到顶端边距2cm:
    oExcel.ActiveSheet.PageSetup.HeaderMargin = 2/0.035
    d.页脚到底端边距3cm:
    oExcel.ActiveSheet.PageSetup.HeaderMargin = 3/0.035
    e.顶边距2cm:
    oExcel.ActiveSheet.PageSetup.TopMargin = 2/0.035
    f.底边距2cm:
    oExcel.ActiveSheet.PageSetup.BottomMargin = 2/0.035
    g.左边距2cm:
    oExcel.ActiveSheet.PageSetup.LeftMargin = 2/0.035
    h.右边距2cm:
    oExcel.ActiveSheet.PageSetup.RightMargin = 2/0.035
    i.页面水平居中:
    oExcel.ActiveSheet.PageSetup.CenterHorizontally = 2/0.035
    j.页面垂直居中:
    oExcel.ActiveSheet.PageSetup.CenterVertically = 2/0.035
    k.打印单元格网线:
    oExcel.ActiveSheet.PageSetup.PrintGridLines = True

    15) 拷贝操作:

    a.拷贝整个工作表:
    oExcel.ActiveSheet.Used.Range.Copy
    b.拷贝指定区域:
    oExcel.ActiveSheet.Range( "A1:E2" ).Copy
    c.从A1位置开始粘贴:
    oExcel.ActiveSheet.Range.( "A1" ).PasteSpecial
    d.从文件尾部开始粘贴:
    oExcel.ActiveSheet.Range.PasteSpecial
    e.复制
    oExcel.cells(1,2).copy
    f.粘贴
    oExcel.cells(1,4).PasteSpecial

    16) 插入一行或一列:
    a. oExcel.ActiveSheet.Rows(2).Insert
    b. oExcel.ActiveSheet.Columns(1).Insert

    17) 删除一行或一列:
    a. oExcel.ActiveSheet.Rows(2).Delete
    b. oExcel.ActiveSheet.Columns(1).Delete

    18) 打印预览工作表:
    oExcel.ActiveSheet.PrintPreview

    19) 打印输出工作表:
    oExcel.ActiveSheet.PrintOut

    20) 工作表保存:
    if not oExcel.ActiveWorkBo感谢对我们的支持~.Saved then
    oExcel.ActiveSheet.PrintPreview

    21) 工作表另存为:
    oExcel.SaveAs( "C:\Excel\Demo1.xls" )

    22) 放弃存盘:
    oExcel.ActiveWorkBo感谢对我们的支持~.Saved = True

    23) 关闭工作簿:
    oExcel.WorkBo感谢对我们的支持~s.Close

    24) 退出 Excel:
    oExcel.Quit

    (二) 使用VBS 控制Excle二维图

    1)选择当第一个工作薄第一个工作表
    set ōSheet=oExcel.Workbo感谢对我们的支持~s(1).Worksheets(1)

    2)增加一个二维图
    achart=oSheet.chartobjects.add(100,100,200,200)

    3)选择二维图的形态
    achart.chart.charttype=4

    4)给二维图赋值
    set series=achart.chart.seriescollection
    range="sheet1!r2c3:r3c9"
    series.add range,true

    5)加上二维图的标题
    achart.Chart.HasTitle=True
    achart.Chart.ChartTitle.Characters.Text=" Excle二维图"

    6)改变二维图的标题字体大小
    achart.Chart.ChartTitle.Font.size=18

    7)给二维图加下标说明
    achart.Chart.Axes(xlCategory, xlPrimary).HasTitle = True
    achart.Chart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "下标说明"

    8)给二维图加左标说明
    achart.Chart.Axes(xlValue, xlPrimary).HasTitle = True
    achart.Chart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "左标说明"

    9)给二维图加右标说明
    achart.Chart.Axes(xlValue, xlSecondary).HasTitle = True
    achart.Chart.Axes(xlValue, xlSecondary).AxisTitle.Characters.Text = "右标说明"

    10)改变二维图的显示区大小
    achart.Chart.PlotArea.Left = 5
    achart.Chart.PlotArea.Width = 223
    achart.Chart.PlotArea.Height = 108

    (三) 应用实例
    1)批量转换某文件夹下的Excel成Txt
    Dim gFileName
    Dim strPath
    Dim strFolder
    Dim xlApp
    Dim fso, f, f1, fc, s
    Dim i, j
    Dim arryFiles()
    Dim moveFilePath
    i = 0

    Set xlApp = CreateObject("excel.application")
    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    strFolder = Wscrīpt.scrīptFullName '获取文件所驻留的文件夹的完整路径
    Set fso = CreateObject("scrīpting.FileSystemObject")
    strPath = strFolder & "\..\Res\TestResult\"

    Set f = fso.GetFolder(strPath)
    Set fc = f.Files
    Redim arryFiles(fc.count)
    For Each f1 in fc
        s = strPath & f1.Name
        arryFiles(i) = s
     i = i + 1
    Next

    For j = 0 to i - 1
     xlApp.Application.Workbooks.Open arryFiles(j)
     xlApp.Application.ActiveSheet.Rows(1).Delete
        xlApp.Application.Workbooks.Item(1).SaveAs arryFiles(j) & ".txt",42
        xlApp.Application.Workbooks.Item(1).Close 0
    Next

  • QTP调用外部dll的例子

    2007-09-13 22:42:32

    【转载】

    dll (VC++6.0),没用 MFC ,直接调用 WINDOWS API 实现的

    *************************************************
    WINDLL_API int killprocess(char * processname)
    {
          
    HANDLE hSnapshot,hProcess;
    int flag;
    int eqflag=0;
    long int pid=-1;
    hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32* processInfo=new PROCESSENTRY32;
    processInfo->dwSize=sizeof(PROCESSENTRY32);
        flag=Process32First(hSnapshot,processInfo);
    while(flag!=0)
    {
    eqflag=0;
        for(int j=0;processInfo->szExeFile[j]!='\0';j++)
    {
          
    if(processInfo->szExeFile[j]!=processname[j])
      eqflag=1;
      
    }
    //printf("%d\n",eqflag);
    if(eqflag==0)
        {
         pid=processInfo->th32ProcessID;
         hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);
         TerminateProcess(hProcess,0);
         
    }
    flag=Process32Next(hSnapshot,processInfo);
    }
    CloseHandle(hSnapshot);
    //printf("%d",pid);
    if(pid==-1)
    return 0;
        //printf("%d",hProcess);
    return 1;

    }
    *********************************************************

     

    Qtp中调用的方法:

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Extern.Declare micInteger,"killprocess","C:\windll.dll","",micString
    rs=Extern.killprocess("QQ.exe")
    msgbox rs

  • QTP个人学习日志_01

    2007-08-27 11:05:22

    = = = = 2007/07/18 = = = 关于应用程序菜单的录制问题:

    应用程序菜单由于直接录制会有记录不到对象的问题,鼠标click事件无法回放。在网上找了不少资料综合了一下终于是把问题解决了。

    首先是录制对象的问题,如果录制时候脚本没记录,可以试下双击该控件,QTP就会自动把控件录制到脚本内,以及在对象仓库里添加该对象。

    再就是菜单选择的问题,也看了不少方法最后发觉是用VBscrīpt的方法比较好也简单,具体Code如下:

    Window("XXX").WinObject("MenuBar_2").Click 32,11 '点击菜单栏

    'vb脚本实现选择菜单

    index = 6   '退出操作在菜单的第六个项

    Set WshShell = CreateObject("Wscrīpt.Shell")

    For i = 1 To index

    WshShell.sendKeys "{DOWN}"   '在弹出的右键菜单中依次下移到第六个

    Next

    WshShell.sendKeys "{ENTER}"  '选择退出操作

    wait (1)

    Set WshShell = nothing '清空WshShell对象

     

    该脚本解决了应用程序使用菜单退出的功能。

     

     

     

     

    = = = = 2007/07/23 = = = 关于计时器的问题:

    使用QTP进行回放时候,需要记录某段操作的时间,一般可以使用事务,再QTP自动生成的报告中可以查看到消耗的时间,但是为了自动化,需要将数据直接倒出成xls的文件,事务的时间值取不出来,后来找到可以用Timer这个计时器。

    class=codeFunction TimeIt(N)

       Dim StartTime, EndTime

       StartTime = Timer

       For I = 1 To N

       Next

       EndTime = Timer

       TimeIt = EndTime - StartTime

    End Function

    帮助中说明Timer的用法是这样的。我自己修改后录制的代码如下:

           var_StartTime = Timer '计时开始,注意此计时器不会在QTP报告中显示

    If window("text:=XXX").Exist(10) Then

           var_EndTime = Timer '计时结束

           runTime = round ((var_EndTime - var_StartTime),3 )

    数字3表示精确到小数点后3位的意思,这个计时器可以很方便的判断一个对象从没有到存在需要多少时间,而且可以轻易实现数据导出!

     

     

     

     

    = = = = 2007/07/23 = = = 关于数据导出的问题:

    接着上一个问题,在缺得了runTime得数据之后,要导出到数据表中,之后再把数据表保存成为一个xls的文件,代码如下:

    DataTable.Value ("启动使用时间", "Action1") = runTime 'runTime的值放在DataTable

    DataTable.SetCurrentRow (j+2)

     

    DataTable.ExportSheet  xlsPath, 2 '数据保存成文件

    "启动使用时间"表示列的名字;"Action1"数据表的名字;j表示循环次数,+2之后可以把数据自动保存到下一行去。

     

     

     

     

    = = = = 2007/07/23 = = = 关于回放过程中某些程序会卡死的问题:

    回放脚本时候不知道是什么原因,IE时常会卡死,关闭不了,对脚本的循环造成影响,这样的话QTP有个关闭进程的的功能,具体代码如下:

    Window("Microsoft Internet Explorer").Close '关闭IE

           If Window("Microsoft Internet Explorer").Exist(1) Then

                         SystemUtil.CloseProcessByName "IEXPLORER.EXE" '有时候IE会卡死,如果卡死强制关闭

           End If

    首先正常关闭,再判断如果对象还存在的话,直接杀进程!

  • 正则表达式用法

    2007-08-26 03:03:14

    正则表达式的概念

      什么是UBB代码?什么是正则表达式?

      UBB代码是HTML的一个变种。一般情况下,UBB论坛不允许你使用HTML代码,而只能用UBB代码替代HTML代码。
      UBB代码是一套由流行的UBB标签组成了固定代码,代码有统一的格式。用户只要遵循代码规则就可以实现用户想要的功能。如:
      想要显示粗体的how are you 字样,就应该输入 how are you而不是输入<b>how are you</b>

      你也许会问:ASP是怎样把 how are you转换为<b>how are you</b>的呢?
      回答这个问题就是:用正则表达式。

    三、正则表达式的用途

       有时我们在制作网站表单数据处理的时候,都需要进行数据验证和字符串替代,特别是UBB论坛要进行大量的数据安全性和字符串替代

    邮于一般的论坛不支持HTML语法这就使得用户不能修改字体,不能贴图等等一些功能。这样使得论坛失去了吸引用户的一个强有力的途径。可能说一个强大的论坛在吸引用户数量上还是很重要的。这样就出现了一个UBB解决方案,即在论坛不支持HTML语法的情况下用户仍然可以定制自已贴子的样式,贴图,增加链接,转贴网页等等诸多的功能,可能达到支持HTML语法同样的效果,而且这样可以使得论坛相对于HTML的论坛安全性大大提高。用户基本不能对论坛过行任何恶意攻击。

    四、正则表达式的语法规则和标记

      
      字符描述:

      ^符号匹配字符串的开头。例如:
        ^abc 与“abc xyz”匹配,而不与“xyz abc”匹配

      $符号匹配字符串的结尾。例如:
        abc$ 与“xyz abc”匹配,而不与“abc xyz”匹配。
        注意:如果同时使用^符号和$符号,将进行精确匹配。例如:
           ^abc$ 只与“abc”匹配   

      *符号匹配0个或多个前面的字符。例如:
        ab* 可以匹配“ab”、“abb”、“abbb”等

      +符号匹配至少一个前面的字符。例如:
        ab+ 可以匹配“abb”、“abbb”等,但不匹配“ab”。

      ?符号匹配0个或1个前面的字符。例如:
        ab?c? 可以且只能匹配“abc”、“abbc”、“abcc”和“abbcc”

      .符号匹配除换行符以外的任何字符。例如:
        (.)+ 匹配除换行符以外的所有字符串

      x|y匹配“x”或“y”。例如:
        abc|xyz 可匹配 “abc”或 “xyz”,而“ab(c|x)yz”匹配 “abcyz”和“abxyz”

      {n}匹配恰好n次(n为非负整数)前面的字符。例如:
        a{2} 可以匹配“aa“,但不匹配“a”

      {n,}匹配至少n次(n为非负整数)前面的字符。例如:
        a{3,} 匹配“aaa”、“aaaa”等,但不匹配“a”和“aa”。
        注意:a{1,}等价于a+
           a{0,}等价于a*

      {m,n}匹配至少m个,至多n个前面的字符。例如:
        a{1,3} 只匹配“a”、“aa”和“aaa”。
        注意:a{0,1}等价于a?

      [xyz]表示一个字符集,匹配括号中字符的其中之一。例如:
        [abc] 匹配“a”、“b”和“c”

      [^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符。例如:
        [^abc] 可以匹配除“a”、“b”和“c”之外的任何字符

      [a-z]表示某个范围内的字符,匹配指定区间内的任何字符。例如:
        [a-z] 匹配从“a”到“z”之间的任何一个小写字母字符

      [^m-n]表示某个范围之外的字符,匹配不在指定范围内的字符。例如:
        [m-n] 匹配除从“m”到“n”之间的任何字符

      \符号是转义操作符。例如:
        \n 换行符
        \f 分页符
        \r 回车
        \t 制表符
        \v 垂直制表符

        \\ 匹配“\”
        \/ 匹配“/”

        \s 任何白字符,包括空格、制表符、分页符等。等价于“[ \f\n\r\t\v]”
        \S 任何非空白的字符。等价于“^\f\n\r\t\v]”
        \w 任何单词字符,包括字母和下划线。等价于“[A-Za-z0-9_]”
        \W 任何非单词字符。等价于“[^A-Za-z0-9_]”

        \b匹配单词的结尾。例如:
          ve\b 匹配单词“love”等,但不匹配“very”、“even”等

        \B匹配单词的开头。例如:
          ve\B 匹配单词“very”等,但不匹配“love”等

        \d匹配一个数字字符,等价于[0-9]。例如:
          abc\dxyz 匹配“abc2xyz”、“abc4xyz”等,但不匹配“abcaxyz”、“abc-xyz”等

        \D匹配一个非数字字符,等价于[^0-9]。例如:
          abc\Dxyz 匹配“abcaxyz”、“abc-xyz”等,但不匹配“abc2xyz”、“abc4xyz”等

        \NUM匹配NUM个(其中NUM为一个正整数),引用回到记住的匹配。例如:
          (.)\1 匹配两个连续相同的字符。

        \oNUM匹配n(其中n为一个小于256的八进制换码值)。例如:
          \o011 匹配制表符

        \xNUM匹配NUM(其中NUM为一个小于256的十六进制换码值)。例如:
          \x41 匹配字符“A”


    五、实例分析

    1)在字符串中精确查找链接地址

    ((http|https|ftp)\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(((\/[\~]*|\\[\~]*)
    (\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)

    我们知道,链接地址一般以http或者https或者ftp等形式出现。初步总结一下就是,链接地址必须符合如下条件:

    条件1
     以http://或者https://或者ftp://等开头(当然还有其它形式,这里只列出主要的)

    条件2
     http://后面必须跟一个单词字符,紧接着单词字符后面的是"."(这样的组合必须出现一次或多次)。紧跟着“.”后面的是域名后缀(如net或者com或者cn等,如果是以IP地址的形式出现就可以是数字)

    条件3
     出现完整的链接地址后,还可以出现下一级或者更多级的目录(还要注意个人主页的地址有可能出现"~"符号)

    条件4
     链接地址末尾可以带参数。如典型的页数?PageNo=2&action=display等

    现在我们用下面的代码来逐个匹配上面的条件——

    1、((http|https|ftp)\/\/|\\\\) 满足条件1
    表示http:// http:\\ https:// https:\\ ftp:// ftp:\\都匹配(在这里考虑了某些用户可能把"//"输成“\\”的易发性错误)
    注意:"|"表示“或者”,"\"是转义字符。“\/\/”表示"//",“\\\\”表示"\\"

    2、((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3}) 满足条件2
    “((\w)+[.]){1,}”表示一个单词字符加一个点号可以出现1次或者多次(这里考虑了某些用户喜欢省略www而将http://www.w3c.com写成http://w3c.com
    “(net|com|cn|org|cc|tv|[0-9]{1,3})”表示必须要以net或者com或者cn或者org或者cc或者tv或者三位以下的数字结束
    [0-9]{1,3}表示三位以下的数字,因为ip地址的任何段不能超过255

    3、(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)* 满足条件3
    “(\/[\~]*|\\[\~]*)”表示可以出现"/~"或者是"\~",(其中“[\~]*”表示 ~ 可以出现也可以不出现),因为不是每个链接地址都有下一级目录
    “(\w)+)|[.](\w)+)”表示必须出现一个单词字符(即目录或者是一个带有扩展名的文件)
    注意:最后还有一个“*”表示上面括号内的可以出现也可以不出现,否则就只能匹配有下一级目录的链接地址了。

    4、(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)满足条件4
    “((([?](\w)+){1}[=]*))*((\w)+){1}”表示形如"?PageNo=2"的字符串可以出现也可以不出现,如果出现则只能出现一次(因为不可能有两个“?”号出现)。

    “([\&](\w)+[\=](\w)+)*)”表示形如“&action=display”的字符串可以出现也可以不出现(因为并不是每个网页都带有两个以上的参数。

    整个“((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*”表示形如“?PageNo=2&action=display”的字符串可以出现也可以不出现(即链接地址可以有参数也可以没有参数)


    把上面的组合起来,我们就可以匹配一个比较全面的链接地址了。比用简单的“(http:\/\/\S+)”来匹配一个链接地址要好,读者可以自行行测试比较。当然,这段代码还有很多不足之处,希望大家能够继续改进。

    2)替代典型的UBB标签:
    我们的目的就是要把成对的替换成<b></b>下面来看我们实现它的模板
      (\[b\])(.+)(\[\/b\])
    这里用了"(.+)"来配匹到之间的整个字符串,在替代的时候我们要写成这样
      str=checkexp(re,str,"<b>$2</b>"
    (注意:checkexp是我自定义的函数,将在后面给出。这个函数将把
    按照我们提供的模板进行替代。)

    也许你会问这里出现一个"$2"是什么东东,呵注意了这个$2可是很重要的,它代表了"(.+)"所配匹的整个字符串。
    为什么是$2而不是$1、$3呢?因为$1代表(\[b\])所匹配的""字符串,$3代表(\[\/b\])所匹配的""字符串,显然这里我们需要的是$2而不是$1$3。
  • 密码参数化情况

    2007-08-26 02:48:06

    密码输入有两种方式,一种改用Set方法,一种SetSecure方法

    用Set方法时直接输入密码就可以了

    如果用SetSecure方法,则需要将明文转换为经过加密后的字符串,具体用Crypt对象的Encrypt方法。

    比如密码是 mercury,用 Crypt.Encrypt("mercury") 可以得到一个值 "464d059be45f8d524b913574b017ed492a8b8d4b"

  • VBScript中SendKeys的妙用

    2007-08-26 02:42:53

    【转载自(sidneylover的空间】

    什么是VBscrīpt呢?

    VBscrīpt的全称是:Microsoft Visual Basic scrīpt Editon.(微软公司可视化BASIC脚本版). VBS(VBscrīpt的进一步简写)是基于Visual Basic的脚本语言,其不编译成二进制文件, 而是直接由宿主(host)解释源代码并执行, 简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序, 用户就能执行了.

    SendKeys 方法

    模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行, 
    其使用格式为:object.SendKeys(string) 

    “object”:表示WshShell对象 
    “string”:表示要发送的按键指令字符串,需要放在英文双引号中。

    -----------------------------------
    1.基本键 

      一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“ WshShell.SendKeys "happy" ”。

    2.特殊功能键 

      对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: 

      Shift---------WshShell.SendKeys "+" 
      Ctrl---------WshShell.SendKeys "^" 
      Alt---------WshShell.SendKeys "%"  (注意   这样使用时,不用大括号括起这些特殊字符。)
      由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 

    另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。
    例如要发送回车键,需要用“ WshShell.SendKeys "{ENTER}" ”表示;
    发送向下的方向键用“ Wshell.SendKeys "{DOWN}" ”表示。 

    Space---------WshShell.SendKeys " " 
    Enter---------WshShell.SendKeys "{ENTER}" 
    ←---------WshShell.SendKeys "{RIGHT}" 
    ↑---------WshShell.SendKeys "{UP}" 
    F1---------WshShell.SendKeys "{F1}" 

    按键                代码    
    BACKSPACE     {BACKSPACE}, {BS}, 或 {BKSP}    
    BREAK         {BREAK}    
    CAPS LOCK     {CAPSLOCK}    
    DEL or Delete {Delete} 或 {DEL}    
    DOWN ARROW    {DOWN}    
    END           {END}    
    ENTER         {ENTER}或 ~    
    ESC           {ESC}    
    HELP          {HELP}    
    HOME          {HOME}    
    INS or Insert {Insert} 或 {INS}    
    LEFT ARROW    {LEFT}    
    NUM LOCK      {NUMLOCK}    
    PAGE DOWN     {PGDN}    
    PAGE UP       {PGUP}    
    PRINT SCREEN  {PRTSC}    
    RIGHT ARROW   {RIGHT}    
    SCROLL LOCK   {SCROLLLOCK}    
    TAB           {TAB}    
    UP ARROW      {UP}    
    F1 {F1}    
    F2 {F2}    
    F3 {F3}    
    F4 {F4}    
    F5 {F5}    
    F6 {F6}    
    F7 {F7}    
    F8 {F8}    
    F9 {F9}    
    F10 {F10}

    Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    -----------------------------------
    按下F5刷新桌面 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "{F5}" 
    ---------------------------------------------------- 
    电脑的自动重启 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^{ESC}u" 
    WshShell.SendKeys "R" 
    ---------------------------------------------------- 
    启动任务管理器 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^+{ESC}" 
    ---------------------------------------------------- 
    QQ消息连发 

    Dim WshShell 
    Set WshShell= Wscrīpt.createObject("Wscrīpt.Shell") 
    WshShell.AppActivate "bomb" 
    for i=1 to 60 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "What do you say" 
    WshShell.SendKeys i 
    WshShell.SendKeys "%s" 
    next 
    ---------------------------------------------------- 
    自动到百度搜索歌曲:white flag 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run("IEXPLORE.EXE") 
    Wscrīpt.Sleep 2000 
    WshShell.AppActivate "about:blank-Microsoft Internet Explorer" 
    WshShell.SendKeys "+{TAB}" 
    WshShell.SendKeys "http://mp3.baidu.com
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    Wscrīpt.Sleep 3000 
    WshShell.SendKeys "white flag" 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    ---------------------------------------------------- 
    自动关机

    Dim WshShell
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    Wscrīpt.Sleep 2000
    WshShell.Run "shutdown -r -t 120"
    wscrīpt.sleep 6000
    WshShell.Run "shutdown -a"
    ---------------------------------------------------- 
    在记事本中输入Happy Birthday!并保存为birth.txt 

    Dim WshShell 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run "notepad" 
    Wscrīpt.Sleep 1500 
    WshShell.AppActivate "无标题 - 记事本" 
    WshShell.SendKeys "H" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys " " 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "B" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "d" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "!" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FS" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "b" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%S" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FX" 
    ---------------------------------------------------- 
    制作能自动定时存盘的记事本 

    '第一部分:定义变量和对象 

    Dim WshShell, AutoSaveTime, TXTFileName 
    AutoSaveTime=300000 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    TXTFileName=InputBox("请输入你要创建的文件名(不能用中文和纯数字):") 

    '第二部分:打开并激活记事本 

    WshShell.Run "notepad" 
    Wscrīpt.Sleep 200 
    WshShell.AppActivate "无标题 - 记事本" 

    '第三部分:用输入的文件名存盘 

    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys TXTFileName 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys "%s" 
    Wscrīpt.Sleep AutoSaveTime 
    '第四部分:自动定时存盘 
    While WshShell.AppActivate (TXTFileName)=True 
    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep AutoSaveTime 
    Wend 
    Wscrīpt.Quit 

     

    自动死机o(∩_∩)o...

    DIM WSHSHELL 
    SET WSHSHELL=Wscrīpt.CreateOBJECT("Wscrīpt.SHELL") 
    'WSHSHELL.RUN " " 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 

    [/quote]


     

     

  • Wscrīpt.Shell 对象详细介绍

    2007-08-26 02:39:03

    【转载自(sidneylover的空间】

    Wscrīpt.Shell 对象详细介绍

    WshShell 对象
    ProgID Wscrīpt.Shell
    文件名 WSHom.Ocx
    CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC21-1CF0-11d0-ADB9-00C04FD58A0B


    下表说明和 WshShell 对象有关的属性。

    属性 说明
    Environment 返回 WshEnvironment 集合对象。
    SpecialFolders 使用 WshSpecialFolders 对象提供对 Windows shell 文件夹的访问,如桌面文件夹,开始菜单文件夹和个人文档文件夹。


    下表说明和 WshShell 对象有关的方法。

    方法 说明
    CreateShortcut 创建并返回 WshShortcut 对象。
    ExpandEnvironmentStrings 扩展 PROCESS 环境变量并返回结果字符串。
    Popup 显示包含指定消息的消息窗口。
    RegDelete 从注册表中删除指定的键或值。
    RegRead 从注册表中返回指定的键或值。
    RegWrite 在注册表中设置指定的键或值。
    Run 创建新的进程,该进程用指定的窗口样式执行指定的命令。


    WshShell.Environment
    Environment 属性返回 WshEnvironment 对象。

    语法
    WshShell.Environment ( [strType]) = objWshEnvironment

    注释
    若 strType 指定了环境变量所处的位置,可能值为 \"System\"、\"User\"、\"Volatile\" 和 \"Process\"。若未提供 strType,则该方法在 Windows NT 中检索系统环境变量或在 Windows 95 中检索进程环境变量。

    对于 Windows 95,strType 参数仅支持 \"Process\"。

    下列变量是由 Windows 操作系统提供的。脚本也可获取由其他应用程序设置的环境变量。

    名称 说明
    NUMBER_OF_PROCESSORS 计算机上运行的处理器数目。
    PROCESSOR_ARCHITECTURE 用户工作站使用的处理器类型。
    PROCESSOR_IDENTIFIER 用户工作站的处理器 ID。
    PROCESSOR_LEVEL 用户工作站的处理器级。
    PROCESSOR_REVISION 用户工作站的处理器版本。
    OS 用户工作站所用的操作系统。
    COMSPEC 用于运行“命令提示”窗口的命令(通常为 cmd.exe)。
    HOMEDRIVE 本地主驱动器(通常为 C 驱动器)。
    HOMEPATH 用户的默认路径(在 Windows NT 上通常为 \\users\\default)。
    PATH 路径环境变量。
    PATHEXT 可执行文件的扩展名(通常为 .com、 .exe、.bat 或 .cmd)。
    PROMPT 命令提示符(通常为 $P$G)。
    SYSTEMDRIVE 系统所在的本地驱动器(例如,c:\\)。
    SYSTEMROOT 系统目录(例如,c:\\winnt)。和 WINDIR 相同。
    WINDIR 系统目录(例如 c:\\winnt)。和 SYSTEMROOT 相同。
    TEMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。
    TMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。


    示例
    \' Retrieve the NUMBER_OF_PROCESSORS system environment variable
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    Set WshSysEnv = WshShell.Environment(\"SYSTEM\")
    Wscrīpt.Echo WshSysEnv(\"NUMBER_OF_PROCESSORS\")

    请参阅
    WshEnvironment 对象


    WshEnvironment 对象
    WshEnvironment 对象未直接给出,可用 WshShell.Environment 属性来访问。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表描述与 WshEnvironment 对象关联的属性。

    属性 说明
    Item 获取或设置指定的环境变量值。
    Count 枚举项的数目。
    length 枚举项的数目 (Jscrīpt)。


    下表描述与 WshEnvironment 对象关联的方法。

    方法 说明
    Remove 删除指定的环境变量。


    WshShell.SpecialFolders
    SpecialFolders 属性提供 WshSpecialFolders 对象以便访问 Windows 的 shell 文件夹,例如桌面文件夹、开始菜单文件夹和个人文档文件夹。

    语法
    WshShell.SpecialFolders = objWshSpecialFolders

    示例
    \' This code fragment shows how to access the desktop folder
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    MsgBox \"Your desktop is \" & WshShell.SpecialFolders(\"Desktop\")
    请参阅
    WshSpecialFolders 对象

    WshSpecialFolders 对象
    该对象未直接给出。要得到 WshSpecialFolders 对象,请使用 WshShell.SpecialFolders 属性。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表描述与 WshSpecialFolders 对象关联的属性。

    属性 描述
    Item 指定文件夹的完整路径(默认)。
    Count 枚举项的数目。
    length 枚举项的数目 (Jscrīpt) 。

    WshSpecialFolders.Item
    Item 属性返回由 strFolderName 指定的文件夹的完整路径。它是默认属性。

    语法
    WshShell.SpecialFolders.Item(\"strFolderName\") = strFolderPath
    WshShell.SpecialFolders(\"strFolderName\") = strFolderPath

    注释
    若请求的文件夹 (strFolderName) 不可用,则 WshShell.SpecialFolders(\"strFolderName\") 返回 NULL。例如,Windows 95 没有 AllUsersDesktop 文件夹,如果 strFolderName = AllUsersDesktop,则返回 NULL。

    Windows 95 和 Windows NT 4.0 操作系统提供下列指定文件夹:
    AllUsersDesktop
    AllUsersStartMenu

    AllUsersPrograms

    AllUsersStartup

    Desktop

    Favorites

    Fonts

    MyDocuments

    NetHood

    PrintHood

    Programs

    Recent

    SendTo

    StartMenu

    Startup

    Templates

    示例
    \' This fragment returns the full path for the Windows Desktop folder
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    StrMyDesktop = WshShell.SpecialFolders(\"Desktop\")

    \' List all special folders
    For Each strFolder In WshShell.SpecialFolders
    MsgBox strFolder
    Next

    请参阅
    WshShell.SpecialFolders 属性


    WshShell.CreateShortcut
    CreateShortcut 方法创建 WshShortcut 对象并将其返回。如果快捷方式标题以 .url 结尾,就会创建 WshURLShortcut 对象。

    语法
    WshShell.CreateShortcut(strPathname) = objShortcut

    示例
    \' This code fragment creates a shortcut
    \' to the currently executing scrīpt
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    Set ōShellLink = WshShell.CreateShortcut(\"Current scrīpt.lnk\")
    oShellLink.TargetPath = Wscrīpt.scrīptFullName
    oShellLink.Save
    Set ōUrlLink = WshShell.CreateShortcut(\"Microsoft Web Site.URL\")
    oUrlLink.TargetPath = \"http://www.microsoft.com\"
    oUrlLink.Save

    请参阅
    WshShortcut 对象、WshUrlShortcut 对象

    WshShortcut 对象
    该对象未直接给出。要获得 WshShortcut 对象,请使用 WshShell.CreateShortcut 方法。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID F935DC28-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC27-1CF0-11d0-ADB9-00C04FD58A0B


    下表说明和 WshShortcut 对象有关的属性。

    属性 说明
    Arguments 快捷方式对象的参数。
    Descrīption 快捷方式对象的说明。
    Hotkey 快捷方式对象的热键。
    IconLocation 快捷方式对象的图标位置。
    TargetPath 快捷方式对象的目标路径。
    WindowStyle 快捷方式对象的窗口样式。
    WorkingDirectory 快捷方式对象的工作目录。


    下表说明与 WshShortcut 对象有关的方法。

    方法 说明
    Save 将快捷方式存储到指定的文件系统中。

    WshShortcut.Arguments
    Arguments 属性提供快捷方式对象的参数。

    语法
    WshShortcut.Arguments = strArguments

    WshShortcut.Descrīption
    Descrīption 属性提供快捷方式对象的说明。

    语法
    WshShortcut.Descrīption = strDescrīption

    WshShortcut.Hotkey
    HotKey 属性提供快捷方式对象的热键。热键是启动或切换程序的键盘快捷方式。

    语法
    WshShortcut.HotKey = strHotKey

    注释
    strHotKey 的BNF语法如下:

    Hotkey ::= modifier* keyname
    modifier ::= \"ALT+\" │ \"CTRL+\" │ \"SHIFT+\" │ \"EXT+\"
    keyname ::= \"A\" .. \"Z\" │
    \"0\".. \"9\" │
    \"Back\" │ \"Tab\" │ \"Clear\" │ \"Return\" │
    \"Escape\" │ \"Space\" │ \"Prior\" │ ...

    所有键的名称都可以在 WINUSER.H 中找到。热键不区分大小写。

    热键只能激活位于 Windows 桌面或 Windows“开始”菜单的快捷方式。

    Windows 资源管理器不接受 ESC、ENTER、TAB、SPACE、PRINT SCREEN 或 BACKSPACE,即使 WshShortcut.Hotkey 遵循 Win32 API 支持它们。因此,建议在快捷方式中不要用这些键。

    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.WshShell\")
    strDesktop = WshShell.SpecialFolders(\"Desktop\")
    Set ōMyShortcut = WshShell.CreateShortcut(strDesktop & \"\\a_key.lnk\")
    OMyShortcut.TargetPath = \"%windir%\\notepad.exe\"
    oMyShortCut.Hotkey = \"ALT+CTRL+F\"
    oMyShortCut.Save
    Wscrīpt.Echo oMyShortCut.HotKey = \"Alt+Ctrl+F\"

    请参阅
    WshSpecialFolders 对象

    WshShortcut.IconLocation
    IconLocation 属性提供快捷方式对象的图标位置。图标位置的格式应为 \"Path,index\"。

    语法
    WshShortcut.IconLocation = strIconLocation

    WshShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。

    语法
    WshShortcut.TargetPath = strTargetPath

    WshShortcut.WindowStyle
    WindowStyle 属性提供快捷方式对象的窗口样式。

    语法
    WshShortcut.WindowStyle = natWindowStyle

    WshShortcut.WorkingDirectory
    WorkingDirectory 为一个快捷方式对象提供工作目录。

    语法
    WshShortcut.WorkingDirectory = strWorkingDirectory

    WshShortcut.Save
    Save 方法把快捷方式对象保存到由 FullName 属性指定的位置。

    语法
    WshShortcut.Save

    WshUrlShortcut 对象
    该对象未直接给出。要获取 WshUrlShortcut 对象,可使用 WshShell.CreateShortcut 方法。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表说明了和 WshUrlShortcut 对象有关的属性。

    属性 说明
    FullName URL 快捷方式对象的完整路径。
    TargetPath URL 快捷方式对象的目标路径。


    下表说明了和 WshUrlShortcut 对象有关的方法。

    方法 说明
    Save 将快捷方式保存到指定的文件系统中。

    WshUrlShortcut.FullName
    FullName 属性提供快捷方式对象的完整路径。

    语法
    WshUrlShortcut.FullName = strFullName

    WshUrlShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。

    语法
    WshUrlShortcut.TargetPath = strTargetPath

    WshUrlShortcut.Save
    Save 方法保存一个快捷方式,该快捷方式指向 FullName 属性指定的位置。

    语法
    WshUrlShortcut.Save

    WshShell.ExpandEnvironmentStrings
    ExpandEnvironmentStrings 方法在 strString 中扩展 PROCESS 环境变量并返回结果字符串。变量被 \'%\' 字符括起。

    环境变量不区分大小写。

    语法
    WshShell.ExpandEnvironmentStrings(strString) = strExpandedString

    示例
    MsgBox \"Prompt is \" & WshShell.ExpandEnviromentStrings(\"%PROMPT%\")

     

    WshShell.Popup
    Popup 方法显示一个弹出式消息框窗口,消息框中包含的消息由 strText 指定。该消息框的窗口标题由 strTitle 指定。若 strTitle 省略,则窗口标题为 Windows scrīpting Host。

    语法
    WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton

    注释
    若提供 natSecondsToWait 且其值大于零,则消息框在 natSecondsToWait 秒后关闭。

    natType 的含义与其在 Win32? MessageBox 函数中相同。下表显示 natType 中的值及含义。下表中的值可以组合。

    按钮类型
    值 说明
    0 显示“确定”按钮
    1 显示“确定”和“取消”按钮
    2 显示“终止”、“重试”和“忽略”按钮
    3 显示“是”、“否”和“取消”按钮
    4 显示“是”和“否”按钮
    5 显示“重试”和“取消”按钮


    图标类型
    值 说明
    16 显示停止标记图标
    32 显示问号图标
    48 显示感叹号图标
    64 显示信息标记图标


    以上两个表并不涵盖 natType 的所有值。完整的列表请参阅 Win32 文档。

    返回值 intButton 指示用户所单击的按扭编号。若用户在 natSecondsToWait 秒之前不单击按扭,则 intButton 设置为 -1 。

    值 说明
    1 “确定”按扭
    2 “取消”按扭
    3 “终止”按扭
    4 “重试”按扭
    5 “忽略”按扭
    6 “是”按扭
    7 “否”按扭


    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    WshShell.Popup \"Where do you want to go today?\"

    请参阅
    Wscrīpt.Echo 方法

    Wscrīpt.Echo
    Echo 方法在窗口(Wscrīpt.exe 中)或“命令提示符”窗口(Cscrīpt.exe 中)显示参数。

    参数用空格分隔。在 Cscrīpt.exe 中,该方法在显示最后一个参数之后输出一对回车/换行(CR LF)。

    语法
    Wscrīpt.Echo [anyArg...]

    示例
    Wscrīpt.Echo
    Wscrīpt.Echo 1, 2, 3
    Wscrīpt.Echo \"Windows scrīpting Host is cool.\"

    WshShell.RegDelete
    RegDelete 从注册表中删除名为 strName 的键或值。

    语法
    WshShell.RegDelete strName

    参数
    strName
    如果 strName 以反斜杠 (\\) 结束,则该方法删除键而不是值。
    strName 参数必须以下列之一的根键名开始:

    短根键名 长根键名
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG


    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegDelete \"HKCU\\scrīptEngine\\Value\" \' Delete value \"Value\"
    WshShell.RegDelete \"HKCU\\scrīptEngine\\Key\\\" \' Delete key \"Key\"

    请参阅
    WshShell.RegRead 方法、WshShell.RegWrite 方法


    WshShell.RegRead
    RegRead 方法返回名为 strName 的注册表键或值。

    语法
    WshShell.RegRead(strName) = strValue

    参数
    strName
    如果 strName 以反斜杠 (\\) 结束,则该方法返回键,而不是值。
    strName 参数必须以下列根键名开始。

    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG


    注释
    RegRead 方法仅支持 REG_SZ、REG_EXPAND_SZ、REG_DWORD、REG_BINARY 和 REG_MULTI_SZ 数据类型。若注册表有其他数据类型,RegRead 返回 DISP_E_TYPEMISMATCH。

    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegRead(\"HKCU\\scrīptEngine\\Val\") \' Read from value \"Val\"
    WshShell.RegRead(\"HKCU\\scrīptEngine\\Key\\\") \' Read from key \"Key\"

    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite 方法


    WshShell.RegWrite
    RegWrite 方法设置名为 strName 的注册表键或值。

    语法
    WshShell.RegWrite strName, anyValue, [strType]

    参数
    strName
    若 strName 以一个反斜杠 (\\) 结束,则该方法设置键,而不是值。
    strName 参数必须以下列根键名开头。

    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG

     

    anyValue
    当 strType 为 REG_SZ 或 REG_EXPAND_SZ 时,RegWrite 方法自动将 anyValue 转换为字符串。若 strType 为 REG_DWORD,则 anyValue 被转换为整数。若 strType 为 REG_BINARY,则 anyValue 必须是一个整数。

    strType
    RegWrite 方法支持 strType 为 REG_SZ、REG_EXPAND_SZ、REG_DWORD 和 REG_BINARY。若其他的数据类型被作为 strType 传递,RegWrite 返回 E_INVALIDARG。
    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegWrite \"HKCU\\scrīptEngine\\Value\", \"Some string value\"
    WshShell.RegWrite \"HKCU\\scrīptEngine\\Key\\\", 1 \"REG_DWORD\"

    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite方法


    WshShell.Run
    Run 方法创建一个新的进程,该进程以 intWindowStyle 窗口样式执行 strCommand。

    语法
    WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])

    参数
    strCommand
    在 strCommand 参数内部的环境变量被自动扩展。

    intWindowStyle
    这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
    SW_HIDE
    0 隐藏窗口并激活另一窗口。
    SW_MINIMIZE
    6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
    SW_RESTORE
    9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
    SW_SHOW
    5 以当前大小和位置激活并显示窗口。
    SW_SHOWMAXIMIZED
    3 激活窗口并以最大化显示该窗口。
    SW_SHOWMINIMIZED
    2 激活窗口并以最小化显示该窗口。
    SW_SHOWMINNOACTIVE
    7 最小化显示窗口。活动窗口保持活动。
    SW_SHOWNA
    8 以当前状态显示窗口。活动窗口保持活动。
    SW_SHOWNOACTIVATE
    4 按窗口最近的大小和位置显示。活动窗口保持活动。
    SW_SHOWNORMAL
    1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。

     

    blnWaitOnReturn
    如果未指定 blnWaitOnReturn 或其值为 FALSE,则该方法立即返回到脚本继续执行而不等待进程结束。
    若 blnWaitOnReturn 设为 TRUE,则 Run 方法返回由应用程序返回的任何错误代码。如果未指定 blnWaitOnReturn 或其值为 FALSE,则 Run 返回错误代码 0(zero)。

    示例
    \' This fragment launches Notepad with the current executed scrīpt
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    WshShell.Run (\"notepad \" & Wscrīpt.scrīptFullName)
    WshShell.Run (\"%windir%\\notepad\" & Wscrīpt.scrīptFullName)

    \' This fragment returns the error code from the executed application
    Return = WshShell.Run(\"notepad \" & Wscrīpt.scrīptFullName, 1, TRUE)

  • GetROProperty,GetTOProperties,GetTOProperty的区别

    2007-08-26 00:49:53

    【转载自(红霞小洼的空间)】

    应该说TO是仓库文件里定义的仓库对象,RO是被测试软件的实际对象
    QTP要求先在仓库文件里定义仓库对象,里面存有实际对象的特征属性的值,
    运行的时候,QTP会根据仓库对象的特征属性描述,寻找到实际对象,然后操作实际对象。

    仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在编写时进行修改,
    也可以在运行过程中进行动态修改,以匹配实际对象。

    相关的几个函数有:

    GetTOProperty():取得仓库对象的某个属性的值
    GetTOProperties():取得仓库对象的所有属性的值
    SetTOProperty():设置仓库对象的某个属性的值
    GetROProperty():取得实际对象的某个属性的值


    理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

    比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
    记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。
    我们要对每条记录进行检查,也就是要点击每个Check按钮。
    但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。

    那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
    然后用下面的脚本,就可以完成测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)
      JavaWindow("Test").JavaButton("Check").Click
    Next


    或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去
    我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")
    JavaWindow("Test").JavaButton("AnyButton").Click


    另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象

    如上面两个任务,可以如下实现

    1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click
    Next

    2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试

    JavaWindow("Test").JavaButton("label:=New").Click
    JavaWindow("Test").JavaButton("label:=Modify").Click
    JavaWindow("Test").JavaButton("label:=Delete").Click
    JavaWindow("Test").JavaButton("label:=Check").Click

  • QTP识别和操作对象的原理

    2007-08-26 00:49:12

    【转载自(红霞小洼的空间)】

    QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。
    对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
    对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。


    两种接口的脚本书写格式的差别在于:
      自身接口需要在对象名后面加object再加属性名或方法名,
      封装接口就不用在对象名后面加object。

    比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:
      设置JavaEdit的内容:
         JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"
      读取JavaEdit的内容:
         msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")

    如果通过JavaEdit的自身接口,脚本如下:
      设置JavaEdit的内容:
         JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")
      读取JavaEdit的内容:
         Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()

    QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
    QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。
    JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

    对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
    但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
    所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
    不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
    封装接口有相应功能的话,就尽量用封装接口吧!


    理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

    但是我们怎么知道对象都有哪些封装接口和自身接口呢?
    其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
    窗口中间有选择栏让你选择Run-time Object或者Test Object,
    当你选择Run-time Object时,它显示的就是对象的自身接口(自身的属性和方法)
    当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

    明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!

    比如执行
      JavaDialog("Add NE").JavaEdit("NE Name").object.setVisible(false)
    哈哈,你的JavaEdit对象就当场消失不见了!!!

     

  • Action之间参数传递

    2007-08-26 00:47:48

    【转载自(红霞小洼的空间)】

    Action之间的参数传递
    例如:在Action1中,有如下代码:
    out_str="This is out_string"
    RunAction "Action2",oneIteration,out_str
    在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
    msgbox(parameter("out_str")),就能正确显示参数了 

    按照该方法如下:

    1.加入Action1后,输入:out_str="This is out_string"
    RunAction "Action2",oneIteration,out_str

    2.然后再加入Action2,注意:Action1和Action2是并列关系,

    在其step->Action Properties中的,input参数栏,加入out_str后,

    这是在Action2中输入:msgbox(parameter("out_str"))

    当运行的时候会出现两个msgbox,其中第一个显示内容为:"This is out_string" ;第二个msgbox显示内容为:空;

    当把和Action1并列的那个Action2去掉后就可以出现一个msgbox,其中显示内容为:"This is out_string",

    结论: Action1和Action2为父子关系时,才会出现传递的参数内容。

  • 模板的应用

    2007-08-26 00:46:08

    【转载自(红霞小洼的空间)】

    新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
    并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;


    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

    当然了,脚本的说明内容可以随意修改,但必须保存到dat目录下,并且文件的名字为:ActionTemplate.MST

  • 关于文件的操作

    2007-08-25 23:53:04

    【转载自(红霞小洼的空间)】


    ==>创建文件
    dim fso, f
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    set f = fso.CreateTextFile("C:\test.txt", true) '第二个参数表示目标文件存在时是否覆盖
    f.Write("写入内容")
    f.WriteLine("写入内容并换行")
    f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
    f.Close()
    set f = nothing
    set fso = nothing

    ==>打开并读文件
    dim fso, f
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    set f = fso.OpenTextFile("C:\test.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
    f.Skip(3) '将当前位置向后移三个字符
    f.SkipLine() '将当前位置移动到下一行的第一个字符,注意:无参数
    response.Write f.Read(3) '从当前位置向后读取三个字符,并将当前位置向后移三个字符
    response.Write f.ReadLine() '从当前位置向后读取直到遇到换行符(不读取换行符),并将当前位置移动到下一行的第一个字符,注意:无参数
    response.Write f.ReadAll() '从当前位置向后读取,直到文件结束,并将当前位置移动到文件的最后
    if f.atEndOfLine then
        response.Write("一行的结尾!")
    end if
    if f.atEndOfStream then
        response.Write("文件的结尾!")
    end if
    f.Close()
    set f = nothing
    set fso = nothing

    ==>打开并写文件
    dim fso, f
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    set f = fso.OpenTextFile("C:\test.txt", 2, false) '第二个参数 2 表示重写,如果是 8 表示追加
    f.Write("写入内容")
    f.WriteLine("写入内容并换行")
    f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
    f.Close()
    set f = nothing
    set fso = nothing

    ==>判断文件是否存在
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    if fso.FileExists("C:\test.txt") then
        response.Write("目标文件存在")
    else
        response.Write("目标文件不存在")
    end if
    set fso = nothing

    ==>移动文件
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    call fso.MoveFile("C:\test.txt", "D:\test111.txt") '两个参数的文件名部分可以不同
    set fso = nothing

    ==>复制文件
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    call fso.CopyFile("C:\test.txt", "D:\test111.txt") '两个参数的文件名部分可以不同
    set fso = nothing

    ==>删除文件
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    fso.DeleteFile("C:\test.txt")
    set fso = nothing

    ==>创建文件夹
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    fso.CreateFolder("C:\test") '目标文件夹的父文件夹必须存在
    set fso = nothing

    ==>判断文件夹是否存在
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    if fso.FolderExists("C:\Windows") then
        response.Write("目标文件夹存在")
    else
        response.Write("目标文件夹不存在")
    end if
    set fso = nothing

    ==>删除文件夹
    dim fso
    set fso = server.CreateObject("scrīpting.FileSystemObject")
    fso.DeleteFolder("C:\test") '文件夹不必为空
    set fso = nothing

  • 函数与已存储过程

    2007-06-10 21:56:22

    已存储程:
    是一段早已存入的代码,它可以接受传递的参数,并完成一系列复杂的任务。  
    有价值在于它们是已编译好的过程:它们迅速而有效的实际任务,因为数据库优化器已经为这段代码设计好了执行模式。
    一些要点:
    1.MSQL允许指定程序的版本号,格式为 procdedure_name;1,一代表版本号的数字。就这样允许访问同一个程序多个不同的版本;
    2.可本地或全局的临时程序,加#或##号,临时的只存在用户持续会话或创建他们的处理会话内,会话结束后,临时程序会自动删除;
    3.MSQL最多可以接受1024个参数,通常用@和任何可接受的数据类型表示。(游标数据类型的参数必须同时是VARYING和OUTPUT);
    4.输入参数的值必须由用户或调用程序提供,参数也可以是默认值,以使程序在没有用户或程序提供参数时也可以执行;
    5.使用OUTPUT关键字可以将参数指定为返回参数。存储于返回参数中的值,可以通过EXEC[UTE]命令返回变量,传给任何调用它的程序。输出参数可以是除TEXT和IMAGE之外的任何数据类型。

    函数:
    是SQL99命令集中一种特殊类型的命令字,它就是返回单个值的由单个词构成的命令,函数值由输入的参数决定。
    聚集函数:对一组值进行处理,但是返回的是单个的归纳值
    标量函数:对单个值进行处理,并返回基于输入值的单个结果。有些标量函数不需要任何参数,如CURRENT_TIME
    自定义函数的一些要点:
    1.通过表数据类型,函数可以返回多个函数值;
    2.自定义函数都必须申明一个或多个由用户提供的参数,除TIMESTAMP数据类型外,全部都可以作为参数;
    3.一个内联函数的T-SQL代码部分可以只是一个SELECT语句。

       以上内容都是在SQL 技术手册上看到,终于对函数和已存储过程有了浅析,但是还是区别不是很开,网上也有不少的相关解释都是提到返回值的问题,也没有什么权威的说法,看来要工作了慢慢了解才能真正知道他们区别了!

    网上的一段解释,好像有点道理的,可以参考:
       如果业务量较小的情况下,采用哪种方式都是可以的。如果数据量较大而且业务复杂最好还是用存储过程,因为当你在程序中调用存储过程时实际上传过去的是几个参数,如果你在程序中写的话,传递的是SQL语句,会增加网络的负担.不过有些简单的东西还是要写在前台程序中,因为我们也不能忽略了客户端计算机的性能,否则是一种资源的浪费。

     

Open Toolbar