jDummy.bat

该博客展示了一段用于Java编译与运行的批处理和WSH脚本代码。通过批处理建立临时文件目录,生成并运行wsh脚本,从注册表获取J2SDK路径,使用正则表达式解析Java源文件获取主类信息,实现Java文件的编译和运行,最后清除临时文件。

@echo off
title Java2 SDK Dummy --- Produced by WangYuantao
::keyWords=脚本;批处理;WSH;Java;编译;Application&Applet运行;傀儡;快速简洁;玩涛出品
::Version=1.2

rem 建立临时文件目录
md c:/temp/dummy > nul
set p=c:/temp/dummy/
dir/b *.java > %p%dir.tmp

rem 生成并运行wsh脚本
copy jDummy.bat %p%ini.wsf > nul
echo 1,50D > handle
echo E >> handle
edlin %p%ini.wsf < handle
echo Waiting...
del handle
%p%ini.wsf
if not exist %p%dummy3.ini goto clearAndExit

rem 回收j2sdk路径
FOR /F %%c IN (%p%dummy1.ini) DO set path=%path%;%%c
rem 回收java文件名,编译
FOR /F %%c IN (%p%dummy2.ini) DO set fn=%%c
echo Compiling...
javac %fn%.java
if errorlevel 1 pause & exit
rem 回收java类型,运行
FOR /F %%c IN (%p%dummy3.ini) DO set tp=%%c
if "%tp%"=="1" cls & java %fn%
if "%tp%"=="2" appletviewer %fn%.html

rem 清除临时文件并退出
pause
:clearAndExit
echo y | del %p%*.* > nul
rd c:/temp/dummy
rem ================================如果要保留.class文件,请注释掉或删除此段命令========
::del *.class
if exist %fn%.html del %fn%.html
rem ================================如果要保留.class文件,请注释掉或删除此段命令========
exit

rem =============此系第50行,以下内容为wsh脚本=========
<package>
 <job id="job1">
 <?job debug="true"?>
 <script language="JScript">

//////////////////////////////////////////全局变量/////////////////////////////////////
var errorr=0;
var p="c://temp//dummy//"//临时路径,与批处理定义一致
var wshshell=WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

/////////////////////////////////////jdk路径,来自注册表///////////////////////////////
var infor="";
var ver=0;
var str="";
try{
ver=wshshell.regread("HKLM//Software//JavaSoft//Java Development Kit//CurrentVersion");
str=wshshell.regread("HKLM//Software//JavaSoft//Java Development Kit//"+ver+"//JavaHome");
}catch(e){
errorr=1
}finally{}
if(errorr==1){
 wshshell.Popup("没有安装J2SDK,或注册表拒绝访问。");
}else{
str+="//bin";
var ini = fso.CreateTextFile(p+"dummy1.ini", true);
ini.Write(str);
ini.Close();

///////////////////////////主类信息,来自java源文件,使用正则表达式解析////////////////
var numMclass=0;
var typeMclass=0;
var dir = fso.OpenTextFile(p+"dir.tmp", 1);
var fn;
var java;
var jf;
var restr="";
var re;
var index=0;
var inindex=0;
var Mfn,Mtype;
while (!dir.AtEndOfStream){
 fn=dir.ReadLine();
 java=fso.OpenTextFile(fn, 1);
 jf=java.ReadAll();
 restr="public class "+fn.split(".")[0];
 re=new RegExp(restr,"i");
 index=jf.search(re);
 if(index!=-1){
  numMclass++;
  typeMclass=1;
  restr="public class "+fn.split(".")[0]+" extends Applet";
  re=new RegExp(restr,"i");
  var inindex=jf.search(re);
  if(inindex!=-1){
   typeMclass=2;
  }
  Mfn=fn.split(".")[0];
  Mtype=typeMclass;
 }
}
if(numMclass==0){WScript.Echo("不存在任何Java文件使其文件名与所含主类同名,请修改。")}
else if(numMclass>1){WScript.Echo("当前文件夹下存在不唯一的Java文件其文件名与所含主类同名,请手动选择编译。")}
else if(numMclass==1){
 ini = fso.CreateTextFile(p+"dummy2.ini", true);
 ini.Write(Mfn);
 ini.Close();
 ini = fso.CreateTextFile(p+"dummy3.ini", true);
 ini.Write(Mtype);
 ini.Close();
 if(Mtype==2){
  ini = fso.CreateTextFile(Mfn+".html", true);
  ini.Write("<applet code=/""+Mfn+".class/" width=/"400/" height=/"400/"></applet>");
  ini.Close();
 }
}
}
 </script>
 </job>
</package>

<think>在批处理脚本中,一个脚本(A.bat)调用另一个脚本(B.bat)时,通常B.bat会独立运行并可能拥有自己的输入输出。但是,如果A.bat需要获取B.bat中用户输入的值,这并不直接支持,因为两个批处理进程是独立的,且B.bat的输入通常来自用户或重定向。 然而,我们可以通过一些技巧实现: 1. 修改B.bat,使其将用户输入的值写入一个临时文件,然后A.bat从该文件中读取。 2. 通过重定向,将B.bat的输出(包括提示信息和用户输入)捕获,然后A.bat解析捕获的内容。但注意,用户输入通常不是输出,除非B.bat使用`set /p`并将输入重定向。 但是,第二种方法比较复杂,因为用户输入默认不会重定向到标准输出。因此,推荐第一种方法。 具体步骤: 1. 修改B.bat,使其在需要输入时,将输入的值写入一个临时文件(例如,在B.bat中,用户输入后立即将输入值写入一个文件)。 2. 在A.bat中调用B.bat,然后等待B.bat执行完毕(或者等待临时文件出现并读取)。 示例: 假设B.bat原来是这样获取输入的: @echo off set /p "userInput=请输入: " echo 您输入的是: %userInput% 修改B.bat(假设我们将其改为B_modified.bat): @echo off set /p "userInput=请输入: " rem 将输入的值写入临时文件 echo %userInput% > temp.txt echo 您输入的是: %userInput% 然后在A.bat中调用B_modified.bat,并读取temp.txt: @echo off call B_modified.bat set /p value=<temp.txt echo 在A.bat中获取到输入值: %value% del temp.txt 但是,这种方法需要修改B.bat,如果无法修改B.bat,则可能无法实现。 另一种无需修改B.bat的方法(但更复杂且有限制): 使用重定向,让B.bat的输入来自一个文件(这样用户输入实际上是从文件中读取),同时捕获B.bat的输出。但这样就需要在A.bat中模拟用户输入,并且需要知道B.bat需要输入几次。而且,如果B.bat有多个输入,那么A.bat需要提前准备好这些输入。 例如,在A.bat中: @echo off rem 准备输入文件,每行一个输入 echo myInput> input.txt rem 调用B.bat,将其输入重定向为input.txt,输出重定向到output.txt call B.bat < input.txt > output.txt rem 然后,我们可以从output.txt中解析出需要的信息,但注意,用户输入的内容在输出中可能被回显,所以我们可以通过输出文件来获取输入值(如果B.bat回显了输入值)?但这不是直接获取输入值,而是获取输出。 但是,如果B.bat在运行过程中没有回显用户输入的值,那么输出文件中就不会有输入值。因此,这种方法并不总是有效。 所以,如果B.bat无法修改,且B.bat没有回显用户输入,那么A.bat无法直接获取B.bat中的用户输入。 结论: 如果可能,修改B.bat,使其将用户输入写入临时文件,然后在A.bat中读取该文件。否则,很难实现。 下面是一个示例,展示如何修改B.bat(假设我们能够修改)并让A.bat获取: 文件 B.bat (修改后): @echo off setlocal set /p "input=请输入:" rem 将输入写入文件 echo %input%> %temp%\b_input.txt echo 你输入的是 %input% endlocal 文件 A.bat: @echo off call B.bat set /p inputFromB=<%temp%\b_input.txt echo 在A.bat中获取到B.bat的输入:%inputFromB% del "%temp%\b_input.txt" 注意:这里使用%temp%环境变量指向临时目录,避免路径问题。 但是,如果B.bat中有多个输入,则需要为每个输入分别写入文件(或者用不同的行写入同一个文件),并在A.bat中解析。 因此,针对用户的问题,如果B.bat无法修改,那么可能需要考虑其他方法,比如使用其他脚本语言(如PowerShell、Python)来调用B.bat并捕获交互过程,但这超出了批处理的能力范围。 所以,在批处理中,最可行的方法是修改B.bat,使其将输入值写入文件。</think>在批处理脚本中,当A.bat调用B.bat时,要获取B.bat中的用户输入,可以通过以下方法实现: ### 解决方案:使用临时文件传递输入值 1. **修改B.bat**:让B.bat将用户输入写入临时文件 2. **A.bat调用B.bat**:执行修改后的B.bat 3. **读取临时文件**:A.bat从临时文件中获取输入值 ```batch :: A.bat @echo off setlocal enabledelayedexpansion :: 调用B.bat并传递临时文件路径 call B.bat "input.tmp" :: 检查临时文件是否存在 if exist "input.tmp" ( set /p userInput=<"input.tmp" del /q "input.tmp" echo 获取到B.bat的输入: !userInput! rem 这里可以使用!userInput!进行后续操作 ) else ( echo 未获取到输入值 ) pause ``` ```batch :: B.bat (修改后) @echo off setlocal enabledelayedexpansion :: 获取A.bat传递的临时文件路径 set "tmpFile=%~1" :: 获取用户输入 set /p "userInput=请输入值: " :: 将输入写入临时文件 echo !userInput! > "!tmpFile!" endlocal ``` ### 关键实现说明: 1. **参数传递**: - A.bat调用时传递临时文件路径:`call B.bat "input.tmp"` - B.bat通过`%~1`获取参数路径 2. **输入捕获**: - B.bat使用`set /p`获取用户输入 - 将输入值写入指定临时文件:`echo !value! > "!tmpFile!"` 3. **数据安全**: - 使用`enabledelayedexpansion`处理特殊字符 - 操作完成后删除临时文件 4. **错误处理**: - 检查文件是否存在`if exist "input.tmp"` - 空输入处理(B.bat中可添加验证) ### 使用示例: 1. 执行A.bat 2. A.bat调用B.bat 3. B.bat显示提示并等待输入 ``` 请输入值: COM5 ``` 4. A.bat显示结果: ``` 获取到B.bat的输入: COM5 ``` ### 注意事项: 1. 文件路径中避免使用空格(或使用引号包裹路径) 2. 确保有文件写入权限 3. 临时文件应使用唯一名称(可用`%RANDOM%`生成) ```batch set "tmpFile=input_%RANDOM%.tmp" ``` 4. 如需传递多个值,可在B.bat中: ```batch echo !value1!>>"!tmpFile!" echo !value2!>>"!tmpFile!" ``` > 此方法通过临时文件在批处理进程间传递数据,是Windows CMD环境下最可靠的跨脚本通信方式[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值