zoukankan      html  css  js  c++  java
  • BAT+VBS、BAT+REG、BAT+HTML 混合编程

    BAT能力虽然比较强大,但如果配合上VBS就更完美了,最近有个设想,如何将一个脚本拓展为VBS能够被执行,而拓展为BAT则同样被成功执行呢?在P处理之家找到了几个示例,放出来大家参考下。

    批处理与其它语言、脚本混合编程
    批处理与VBS混合编程1
    http://www.cn-dos.net/forum/viewthread.php?tid=25333

    这个想法我思考了很久。

    巧妙利用 bat 和 vbs 的语法特征,让同一个文件,被 cmd.exe 识别成批处理,让 wscrpt.exe 识别成 vbs,并且同时符合两者的语法,并且保证都没有错误,保证两者的高度兼容。经过一个通宵的努力,我实现了这种 bat/vbs 复合编程。

    一个 批处理 .vbs 文件,在前面加一段代码(头),就变成了 .bat 批处理,注意,没有生成临时文件,不用修改任何原有代码。

    例子:保存下列代码为 test.bat,注意是批处理,但是这个批处理却成功的被 wsh 解析执行了!
    复制内容到剪贴板代码:
    :On Error Resume Next
    Sub bat
    echo off & cls
    echo Batching_codez_here_following_vbs_rules & pause
    start wscript -e:vbs "%~f0"
    Exit Sub
    End Sub
    MsgBox "This is vbs"
    保存代码为 test.bat,可以看到 echo 出来的东西和 msgbox 出来的消息,呵呵

    以上代码只是一个示例,同时执行了 一段 批处理 和 vbs,没有生成临时文件。用了大量的 hack 技巧

    下面粗略解释下代码

    :On Error Resume Next
    cmd.exe 识别成一段注释
    wscript.exe 这样识别, : 在vbs语法里代表分行,然后 On Error Resume Next,也就是让WSH忽略一些错误

    start wscript -e:vbs "%~f0"
    cmd.exe 识别成:启动 wscript.exe ,其参数是:
    ① -e:vbs 设定以vbs解析文件自身
    ② "%~f0" 指这个批处理本身。

    wscript.exe 把这句识别成:调用一个叫 start 的函数,函数参数是 wscript 这个变量,然后用这个函数的结果来 减去 e。接下来是又是一个 : ,分行,然后又是调用一个名叫 vbs 的函数,参数是字符: "%~f0"

    这句是最为精巧的,因为它成功的让 vbs 引擎解释了一段批处理,而且没有错误!当然这些 start()、vbs()函数是不存在的,但是会被 cmd.exe 当成命令执行。为什么不用 wscript //e:vbs "%~f0" 来执行呢?vbs解析会出错的,呵呵

    这段代码的核心思想已经介绍完毕了。下面,为了让 批处理 以vbs调用其自身后,马上退出,我们需要 exit 或者 goto :eof,但是 goto call exit 在vbs又是一个关键词,所以我们只能用符合 vbs 语法的 exit sub,所以我们在第二句加一个
    sub bat,其实 cmd.exe 寻找了一个叫 sub.exe 的命令,但是这个命令是不存在的,cmd.exe 跳过。然后在 6、7 句加一个 exit sub 以及 end sub,让 批处理结束,同时又符合 vbs 的语法

    那个 echo off & cls ,批处理的意思就是相当于 @echo off ,但是 vbs 不认 @ 符号,所以改成 echo off & cls , vbs 可以解析为,调用一个叫 echo() 的函数,参数为 off & cls ,也就是两个字符串 off 和 cls 相加

    Well,接下来,你可以自由地在批处理中书写vbs脚本了,效率和真正的vbs一样高!

    这段代码的好处是:不用生成临时文件。其实用 echo 或者 more 或者 find 来生成临时vbs很浪费系统资源的,用我写的这段代码,就完全免去了这些麻烦。直接混合编程,以 start wscript -e:vbs "%~f0" 为界限,上面写 批处理,下面写 vbs,并行不悖!

    好了,偶累了,休息去了。大家如果有更好的想法,请回帖,大家一起讨论。

    代码以 GPL 发布,也就是说,你用了 est 的代码,你的代码就得给我开源,嘿嘿

    ================华丽的分割线====================

    2006-12-5 新增:支持传递参数的版本:利用了vbs 对 ' 注释敏感的特性
    复制内容到剪贴板代码:
    :On Error Resume Next

    :Sub bat
    echo off & cls
    echo Batching_codez_here_following_vbs_rules & pause >nul
    echo '>nul & start "" wscript //e:vbscript "%~f0" %*
    Exit Sub : End Sub

    MsgBox "This is vbs"
    for each i in wscript.arguments
    wscript.echo i
    next
    批处理与VBS混合编程2
    http://www.cn-dos.net/forum/viewthread.php?tid=39082
    复制内容到剪贴板代码:
    ' 2>nul 3>nul&@echo off&cls
    '&start wscript.exe /nologo /e:vbs %0&exit
    createobject("sapi.spvoice").speak("ger lee shir joan gwaur DOS lieng merng")
    msgbox "这里是中国DOS联盟!",,"Welcome"
    批处理与reg混合编程
    http://www.cn-dos.net/forum/viewthread.php?tid=42261
    复制内容到剪贴板代码:
    REGEDIT4

    ;@cls&regedit/s "%~f0"&goto bat

    /*
    bat-reg {s11ss@www.cn-dos.net 2008-8-18}
    :bat
    :bat代码部分--------开始
    @echo off
    echo 在HKEY_CURRENT_USER下成功添加了项CN-DOS!
    pause
    exit/b
    bat代码部分--------结束
    */

    #reg代码部分--------开始
    [HKEY_CURRENT_USER\CN-DOS]
    #reg代码部分--------结束
    批处理与HTML混合编程1
    http://www.cn-dos.net/forum/viewthread.php?tid=39655
    复制内容到剪贴板代码:
    :<!--
    ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::

    ::::::::1.执行HTML代码之前的BAT代码::::::::
    @echo off
    call :e Starting mshta...
    pause
    ::::::::1.执行HTML代码之前的BAT代码::::::::

    ::执行HTML代码:
    start mshta %0

    ::::::::2.执行HTML代码之后的BAT代码::::::::
    call :e Mshta is executing HTML codes...
    pause
    ::::::::2.执行HTML代码之后的BAT代码::::::::

    ::退出BAT:
    exit/b

    :::::::BAT函数定义部分:::::::
    :e
    echo %*
    goto :eof
    :::::::BAT函数定义部分:::::::

    ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
    -->

    <!--此句用来清除第一行的:-->
    <script>document.body.innerText=""</script>

    <!--------------------------HTML-------------------------->
    <body onkeypress=window.close()>
    <hr color=red>
    <marquee><font color=green>HTML Codes</font></marquee>
    <hr color=red>
    <!--------------------------HTML-------------------------->

    <!--        BAT & HTML        {s11ss@www.cn-dos.net/forum 2008-4-22}
    思路:当此文件被当作BAT文件执行时,未执行到HTML代码部分时就已退出;
          当此文件被当作HTML文件执行时,BAT代码部分被注释,不会被执行。
    -->
    批处理与HTML混合编程2
    http://www.cn-dos.net/forum/viewthread.php?tid=46757
    复制内容到剪贴板代码:
    :<html><!--
    ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::

    ::::::::1.执行HTML代码之前的BAT代码::::::::
    @echo off
    call :e Starting hh...
    pause
    ::::::::1.执行HTML代码之前的BAT代码::::::::

    ::执行HTML代码:
    start hh "%~f0"

    ::::::::2.执行HTML代码之后的BAT代码::::::::
    call :e hh is executing HTML codes...
    pause
    ::::::::2.执行HTML代码之后的BAT代码::::::::

    ::退出BAT:
    exit/b

    :::::::BAT函数定义部分:::::::
    :e
    echo %*
    goto :eof
    :::::::BAT函数定义部分:::::::

    ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
    -->

    <!--此句用来清除第一行的:-->
    <script>document.body.innerText=""</script>

    <!--------------------------HTML-------------------------->
    <body onkeypress=window.close()>
    <hr color=red>
    <marquee><font color=green>HTML Codes</font></marquee>
    <hr color=red>
    <!--------------------------HTML-------------------------->

    <!--        BAT & HTML        {[email]s11ss@www.cn-dos.net[/email]/forum 2009-4-2}
    思路:当此文件被当作BAT文件执行时,未执行到HTML代码部分时就已退出;
          当此文件被当作HTML文件执行时,BAT代码部分被注释,不会被执行。
    -->

    本人学习后编写一个脚本如下

    ' 2>nul&@echo off
    ' 2>nul&>>information.vbs echo Dim WshShell,FSO 
    ' 2>nul&>>information.vbs echo Set WshShell = WScript.CreateObject("WScript.Shell")
    ' 2>nul&>>information.vbs echo Set FSO = CreateObject("Scripting.FileSystemObject") 
    ' 2>nul&>>information.vbs echo CloseTime = 3 
    ' 2>nul&>>information.vbs echo title="关于作者" 
    ' 2>nul&>>information.vbs echo Copyright="逍遥@浪子@" 
    ' 2>nul&>>information.vbs echo QQ="QQ:422547345"
    ' 2>nul&>>information.vbs echo WshShell.popup chr(10) ^& "浪子博客: http://hi.baidu.com/逍遥问 "+ chr(10) ^& _ 
    ' 2>nul&>>information.vbs echo chr(10) ^& "Copyright(C) " + Copyright +" " + QQ _ 
    ' 2>nul&>>information.vbs echo , CloseTime, + title, 0 + 64 
    ' 2>nul&start information.vbs & ping -n 2 127.1>nul
    ' 2>nul& del information.vbs /q
    ' 2>nul&exit /b
    On Error Resume Next
    Dim WshShell,FSO 
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set FSO = CreateObject("Scripting.FileSystemObject") 
    CloseTime = 3 
    title="关于作者" 
    Copyright="逍遥@浪子@" 
    QQ="QQ:422547345"
    WshShell.popup chr(10) & "浪子博客: http://hi.baidu.com/逍遥问 "+ chr(10) & _ 
    chr(10) & "Copyright(C) " + Copyright +" " + QQ _ 
    , CloseTime, + title, 0 + 64

    没啥技术含量,先讲解下原理' 2>nul&@echo off

    '号在VBS中起到注释作用,所以如果当为VBS后缀运行时BAT代码就被当注释跳过了.

    2>nul&的作用在BAT中只是起到隐藏显示的作用,所以当后缀为BAT执行时被忽略,能正常运行,当然,

    ' 2>nul&exit /b当执行到这句的时候,CMD自动退出了,下面的VBS代码就无法被执行了...

    程序充其量只是将VBS代码和BAT代码分别写在同一个程序中,由不同的脚本解释器解释执行罢了,没能达到混合编程的效果,这样写双份代码去整一个程序,没啥大的开发必要,完全可以用BAT动态生成VBS,再调用.当然,各位有兴趣的朋友可以研究下.....

    转载自:http://hi.baidu.com/zzwpower/blog/item/b2ec2e1ec0956ce11bd576b5.html
  • 相关阅读:
    Android开发之基本控件和详解四种布局方式
    Android开发之Activity的创建跳转及传值
    设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)
    设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
    设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)
    设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
    设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
    设计模式(六):控制台中的“命令模式”(Command Pattern)
    设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
    设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
  • 原文地址:https://www.cnblogs.com/zuike/p/2569511.html
Copyright © 2011-2022 走看看