|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 | 
| 『楼 主』:
 [讨论][共同参与]批处理脚本的混合编程
 
使用 LLM 解释/回答一下 
 
 
To All:
 
 在论坛上面看了不少的帖子,有不少是关于批处理与其它语言混合编程的例子,这样是很有意义的,一来可以提高大家学习bat脚本的兴趣,二来可以提高大家的混合编程能力。希望大家可以把自己关于bat的混合编程的心得拿出来和大家分享。
 
 就我所知的批处理和其它语言混合编程的例子有:bat/vbs、bat/c#、bat/js、bat/html、bat/asm等等,而这学期,我们开始学习《Java程序设计语言》了,最基础的就是用javac.exe和java.exe这两个程序来编译、链接和运行java程序,最后再来做成可执行程序。
 
 因为这两个程序都是在命令行运行的,所以我想到了直接利用bat来对java源程序进行编译链接,免得每次都要重复这个”建立编写java源文件(*.java),再来命令行用Javac *.java来编译*.java文件,然后再在命令执行生成的*.class文件”烦琐的过程。下面我就演示一下这个过程,其实很简单:
 
 Bat_Java.bat:
 
 @echo off&more +3 %0>abc.javajavac abc.java&java abc&pause&exit/b
 ==============================
 public class abc{
 public static void main(String args){
 System.out.println("\n\tHello,China DOD Union.\n");
 }
 }
 这样每次运行这个bat文件就可以直接编译运行java程序了,发现错误也可以直接修改"====="下面的"源文件"了。有Java环境的朋友可以试试。
 
 最后,说明发这个帖子的目的吧:之所以发这个帖子,是为了抛砖引玉,让更多的人挖掘批处理和其它语言的混合编程,充分利用混合编程带给我们的便利和乐趣。
 
 Last edited by lxmxn on 2007-3-26 at 10:35 PM ] 
 
 
 | 此帖被 +4 点积分    点击查看详情 | 评分人:【 estar 】 | 分数: +2 | 时间:2007-3-27 11:39 |  | 评分人:【 axi 】 | 分数: +2 | 时间:2007-4-5 04:19 | 
 | 
 
 
 
 |  | 
|  2007-3-27 11:25 |  | 
|  | 
 
| estar 中级用户
 
    
 
 
 
 积分 346
 发帖 103
 注册 2004-4-6
 状态 离线
 |  | 
|  2007-3-27 11:39 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 |  | 
|  2007-4-2 00:24 |  | 
|  | 
 
| flyinspace 银牌会员
 
      
 
 
 
 积分 1206
 发帖 517
 注册 2007-3-25
 状态 离线
 | 
| 『第 4 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
我不是不想看。只是不会vbs 啊。只会c语言,c++语言。但又用不到这个批处理 中来
 
 
 
 
 
 |  
                  |  知,不觉多。不知,乃求知
 |  | 
|  2007-4-2 00:30 |  | 
|  | 
 
| bjsh 银牌会员
 
      
 
 
 
 积分 2000
 发帖 621
 注册 2007-1-1
 状态 离线
 |  | 
|  2007-4-2 02:43 |  | 
|  | 
 
| axi 中级用户
 
    脚本爱好者
 
 
 积分 238
 发帖 93
 注册 2007-3-11
 来自 GZ
 状态 离线
 | 
| 『第 6 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
关于混合编程用 more +n 方式把第 n+1 行及以下内容创建成一个文件的方法非常好用,例如:
 @echo off
 more +10 %0>>html1.html
 exit
 
 11111
 22222
 
 33333
 44444
 
 55555
 66666
 ... ...
 
 以上方法可以把第11行及以下内容(即 55555 及以下)用 more +10 %0>>html1 生成一个 html 文件,如果想把中间内容(例如第8行至第9行)生成另一个 html 文件又如何呢?
 
 用 echo 方法需考虑特殊符号问题,如果代码非常多则工作量大且容易出错。给每行加上标记,再用 findstr 提取带标记的行来创建另一个文件,此法应用在创建VBS上可行,标记符用 'xxx 就可以,生成的VBS文件中的标记符不影响VBS文件的执行,但在每行 html 代码上加标记有困难,标记将影响 html 文件的执行。如果用 for 加 more 方法可以提取中间内容,但由于变量的问题,可能无法提取较长或有特殊符号的行。有无好方法呢?
 
 Last edited by axi on 2007-4-4 at 01:00 PM ]
 
 
 
 
 |  | 
|  2007-4-4 13:58 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 | 
| 『第 7 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
 以上方法可以把第11行及以下内容(即 55555 及以下)用 more +10 %0>>a.html 生成一个 html 文件,如果想把中间内容(例如第8行至第9行)生成另一个 html 文件又如何呢?
 
 
 可以用for+findstr来实现,稍微麻烦一些。
 
 
 
 
 
 |  | 
|  2007-4-5 01:21 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 | 
| 『第 8 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Re 6F:
 For example:
 
 @echo off&Setlocal EnableDelayedExpansion
 echo This program is running...
 for /f "delims=" %%a in ('FINDSTR .* %0') do (
 set /a a+=1
 if !a! gtr 8 if !a! leq 10 >>temp.vbs echo/%%a
 )
 temp.vbs&pause&del temp.vbs&exit/b
 :::::::::::::::::::::The eight line:::::::::::::::::::
 msgbox "Hello,China DOS Union",1,"CN-D0S"
 msgbox "If you see this , it worked",1,"Warning"
 msgbox "If you see this , it not worked",1,"Error"
 hello,everydody!
 
 
 
 
 
 | 此帖被 +2 点积分    点击查看详情 | 评分人:【 axi 】 | 分数: +2 | 时间:2007-4-5 04:18 | 
 | 
 
 
 
 |  | 
|  2007-4-5 01:42 |  | 
|  | 
 
| willsion 高级用户
 
     
 
 
 积分 793
 发帖 312
 注册 2004-9-2
 状态 离线
 |  | 
|  2007-4-5 01:50 |  | 
|  | 
 
| axi 中级用户
 
    脚本爱好者
 
 
 积分 238
 发帖 93
 注册 2007-3-11
 来自 GZ
 状态 离线
 | 
| 『第 10 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
To: lxmxn此方法成功,例如:
 
 @echo off&Setlocal EnableDelayedExpansion
 echo This program is running...
 for /f "delims=" %%a in ('FINDSTR .* %0') do (
 set /a a+=1
 if !a! geq 9 if !a! leq 80 >>hta1.hta echo/%%a
 )
 exit
 ::::::::::::::::::::: Hta1 :::::::::::::::::::
 <html>
 <head>
 <title>磁盘空间查看器</title>
 <script language="vbscript">
 window.resizeTo 473, 300
 window.moveTo(screen.width-500)/2,(screen.height-243)/2
 
 Sub Window_onLoad
 GetDiskSpace
 End Sub
 
 Sub GetDiskSpace
 Const HARD_DISK = 3
 Const GB = 1073741824
 
 strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 Set colDisks = objWMIService.ExecQuery _
 ("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")
 strHTML = "<table border='1'>"
 strHTML = strHTML & "<tr>"
 strHTML = strHTML & "<td width=110px align=center><font size=2><b>" & "分区" & "</b></td>"
 strHTML = strHTML & "<td width=110px align=center><font size=2><b>" & "容量" & "</b></td>"
 strHTML = strHTML & "<td width=110px align=center><font size=2><b>" & "已用" & "</b></td>"
 strHTML = strHTML & "<td width=110px align=center><font size=2><b>" & "未用" & "</b></td>"
 strHTML = strHTML & "<td width=110px align=center><font size=2><b>" & "空闲" & "</b></td>"
 
 
 For Each objDisk In colDisks
 intFreeSpace = objDisk.FreeSpace/GB
 intTotalSpace = objDisk.Size/GB
 pctFreeSpace = intFreeSpace/GB / intTotalSpace/GB
 infFuLin = intTotalSpace-intFreeSpace
 DeviceID = objDisk.DeviceID
 strHTML = strHTML & "<tr>"
 strHTML = strHTML & "<td width=110px align=center>" & DeviceID & "</td>"
 strHTML = strHTML & "<td width=110px align=center><font color=#DB2C00>" & FormatNumber(intTotalSpace,1,-1,-1,0) & "</td>"
 strHTML = strHTML & "<td width=110px align=center><font color=#DB2C00>" & FormatNumber(infFuLin,1,-1,-1,0) & "</td>"
 strHTML = strHTML & "<td width=110px align=center><font color=#DB2C00>" & FormatNumber(intFreeSpace,1,-1,-1,0) & "</td>"
 strHTML = strHTML & "<td width=110px align=center><font color=#FF8000>" & FormatPercent(intFreeSpace/intTotalSpace) & "</td>"
 
 Next
 strHTML = strHTML & "</table>"
 DataArea.InnerHTML = strHTML
 End Sub
 
 Sub setx(t)
 dim obj : set obj = window.event.srcElement
 if t = "" Then
 obj.style.color  = "gray"
 obj.style.cursor = "default"
 Else
 obj.style.color  = "darkblue"
 obj.style.cursor = "hand"
 End if
 footer.innerHTML = t
 end Sub
 
 </script>
 </head>
 
 <body>
 <br>
 <font size="2">磁盘分区的使用情况(单位:<font color="#FF0000">GB</font>)</font></font>
 <font size="2"><a style="text-decoration: none" href="http://www.cn-dos.net/forum/">                   中国DOS联盟论坛</a> <a style="text-decoration: none" href=" "> </a></font>
 </font>
 <br>
 <body scroll="no">
 <body bgcolor="#d0d0d0">
 <hta:application contextmenu="no" icon=hdd.ico>
 <span id = "DataArea"></span>
 </span>
 <span style="color:darkblue" id="footer"></span>
 </body>
 </html>
 
 ::::::::::::::::::::: VBS1 :::::::::::::::::::
 strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 Set colProcessList = objWMIService.ExecQuery _
 ("Select * from Win32_Process Where Name = 'wscript.exe'")
 For Each objProcess in colProcessList
 objProcess.Terminate()
 Next
 
 用 geq 9 取大于等于9行,用 leq 80 取小于等于80行(?), 事实上 </html> 是位于第84行,何解呢?
 
 Last edited by axi on 2007-4-5 at 08:01 AM ]
 
 
 
 
 |  | 
|  2007-4-5 02:35 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 | 
| 『第 11 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
 用 geq 9 取大于等于9行,用 leq 80 取小于等于80行? 事实上 </html> 是位于第97行,点解呢?
 
 不明白你说的意思,你的 </html> 实际是在第84行的,这么你设置成80行呢?
 
 
 
 
 
 |  | 
|  2007-4-5 03:10 |  | 
|  | 
 
| axi 中级用户
 
    脚本爱好者
 
 
 积分 238
 发帖 93
 注册 2007-3-11
 来自 GZ
 状态 离线
 | 
| 『第 12 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
哦,我把空行也算进去了,80 行是我试出来的,如果设置成 84 行,就到了这一行:& "{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2")
 
 不过,无所谓,反正主要问题是解决了。最精秒是这句 if !a! gtr 8 if !a! leq 10 >>temp.vbs echo/%%a ,多谢lxmxn兄的帮助。
 
 (补上:把10楼代码中的空行全删去,</html>就在75行,leq 80 改成 leq 75 提取成功)
 
 Last edited by axi on 2007-4-5 at 08:24 AM ]
 
 
 
 
 |  | 
|  2007-4-5 03:47 |  | 
|  | 
 
| airosp 初级用户
 
   
 
 
 
 积分 99
 发帖 41
 注册 2007-2-19
 状态 离线
 |  | 
|  2007-4-5 05:49 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 |  | 
|  2007-4-5 08:47 |  | 
|  | 
 
| airosp 初级用户
 
   
 
 
 
 积分 99
 发帖 41
 注册 2007-2-19
 状态 离线
 | 
| 『第 15 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
是指用了TCC可以把C代码写进bat,ECHO给TCC执行,这样bat就可以直接与C混合了。 
 
 
 
 
 |  
                  |  量子公民
 |  | 
|  2007-4-5 22:46 |  |