Из всех вопросов, которые я считать историю позади вашей проблемы идет что-то вроде этого:
Ваш босс, г-н Д. Вейдер, попросил вас разработать систему сборки для своего приложения Java для . «Хорошо», вы сказали, «давайте использовать Eclipse и/или Ant». «Нет», сказал г-н Вейдер, «у нас будет современная BS с .BAT и одним кнопками GUI».
Итак, вы создали экспериментальный проект:
tree /a /f .
E:\TRIALS\SOTRIALS\ANSWERS\19944721
|
+---vbs
| | javacompile.hta
| | javacompile.vbs
|
\---java
+---good
| Good.java
|
\---bad
Bad.java
Начиная с минимальным Добром.Java:
class Good {
public static void main(String[] args) {
System.out.println("use Eclipse!");
}
}
Вы проверили:
javac Good.java
- no news are good news --
echo %ERRORLEVEL%
0 <-- javac may set ERRORLEVEL
java Good
use Eclipse! <-- it works
ту же процедуру для плохой:
class Bad {
public static void main(String[] args) {
System.out.println("D. Vader says: 'Use .bat and one button GUI!'.");
}
javac Bad.java
Bad.java:4: reached end of file while parsing
}
^ <-- javac finds the missing }
1 error
echo %ERRORLEVEL%
1 <-- javac really sets ERRORLEVEL
Тогда Вы писали минимальный GUI: javacompile.hta
<html>
<head>
<Title>JavaCompile</Title>
<hta:application id="javacompile" scroll = "no">
<script type="text/vbscript" src="javacompile.vbs"></script>
</head>
<body>
<form>
<input type="button" id="bttCheckBasics" value="Check Basics"/>
<form>
</body>
</html>
и «код позади» javacompile.vbs
Option Explicit
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
' document.location: "file:///E:/trials/SoTrials/answers/19944721/vbs/javacompile.hta"
Dim gsVbsF : gsVbsF = Replace(goFS.GetParentFolderName(Mid(document.location, 9)), "/", "\")
Dim gsJavaF : gsJavaF = goFS.GetAbsolutePathName(goFS.BuildPath(gsVbsF, "..\java"))
Dim gsGoodF : gsGoodF = goFS.BuildPath(gsJavaF, "good")
Dim gsBadF : gsBadF = goFS.BuildPath(gsJavaF, "bad")
Sub bttCheckBasics_onclick()
MsgBox "Sub bttCheckBasics_onclick() was called."
MsgBox Join(Array("Known Folders:", gsVbsF, gsJavaF, gsGoodF, gsBadF), vbCrLf)
End Sub
и удостоверился, что GUI знает, где именно (и работает автоматическое связывание).
(Copy from MessageBox)
Known Folders:
E:\trials\SoTrials\answers\19944721\vbs
E:\trials\SoTrials\answers\19944721\java
E:\trials\SoTrials\answers\19944721\java\good
E:\trials\SoTrials\answers\19944721\java\bad
---------------------------
OK
---------------------------
Чтобы получить мяч прокатки, вы добавили кнопку к .hta
<br/>
<input type="button" id="bttKiss" value="Keep It Simple, Stupid"/>
и некоторый код на VBS:
Sub bttKiss_onclick()
MsgBox "Sub bttKiss_onclick() was called."
KissCompile gsGoodF, "Good.java", "bgood.bat"
KissCompile gsBadF, "Bad.java", "bbat.bat"
End Sub
Sub KissCompile(sF, sJava, sBat)
goWSH.CurrentDirectory = sF
Dim sCmd : sCmd = Join(Array("javac", sJava))
Dim oExec : Set oExec = goWSH.Exec(sCmd)
Do Until cnWshFinished = oExec.Status : Loop
MsgBox Join(Array(qq(sCmd), "(javac) ExitCode:", oExec.ExitCode))
If 0 <> oExec.ExitCode Then MsgBox oExec.StdErr.ReadAll(), vbAbortRetryIgnore, "You messed it up, Mr. Vader!"
End Sub
Function qq(s)
qq = """" & s & """"
End Function
Теперь GUI показывает два MessageBoxes для плохой случай:
---------------------------
"javac Bad.java" (javac) ExitCode: 1
---------------------------
OK
---------------------------
---------------------------
You messed it up, Mr. Vader!
---------------------------
Bad.java:4: reached end of file while parsing
}
^
1 error
---------------------------
Mr. Vader i Не удивлены: черные окна повсюду, а не один. БАТ! Ваш гениальный трюк установки goWSH.CurrentDirectory
не впечатляет его вообще.
Так что вы написали bgood.bat:
@echo off
javac Good.java
IF ERRORLEVEL 1 GOTO :bingo
echo SUCCESS
GOTO :end
:bingo
echo FAILURE
:end
и соответствующего bbad.bat. Некоторые тесты:
bbad
Bad.java:4: reached end of file while parsing
}
^
1 error
FAILURE
JAVA E:\trials\SoTrials\answers\19944721\java\bad
echo %ERRORLEVEL%
1
Теперь история превращается в научную фантастику. Вы будете следовать моему совету , используя мой BTicks function, слегка измененный для лучшей обработки каталогов и минус ошибка, связанная с удалением файлов журнала. Так util.vbs выглядит
Option Explicit
Const cnWshRunning = 0 ' The job is still running.
Const cnWshFinished = 1 ' The job has completed.
Const SW_SHOWMINNOACTIVE = 7
Const ForReading = 1
Function qq(s)
qq = """" & s & """"
End Function
' BTicks - execute sCmd via WSH.Run
' aRet(0) : goWSH.Run() result
' aRet(1) : StdErr/error message
' aRet(2) : StdOut
' aRet(3) : command to run
Function BTicks(sExecF, sLogF, sCmd)
goWSH.CurrentDirectory = sExecF
Dim aRet : aRet = Array(-1, "", "", "")
Dim sFSpec1 : sFSpec1 = goFS.BuildPath(sLogF, goFS.GetTempName())
Dim sFSpec2 : sFSpec2 = goFS.BuildPath(sLogF, goFS.GetTempName())
aRet(3) = Join(Array(_
qq("%comspec%") _
, "/c" _
, qq(Join(Array(_
sCmd _
, "1>" & qq(sFSpec1) _
, "2>" & qq(sFSpec2) _
)))))
Dim aErr
On Error Resume Next
aRet(0) = goWSH.Run(aRet(3), SW_SHOWMINNOACTIVE, True)
aErr = Array(Err.Number, Err.Description, Err.Source)
On Error GoTo 0
If 0 <> aErr(0) Then
aRet(0) = aErr(0)
aRet(1) = Join(Array(aErr(1), aErr(2), "(BTicks)"), vbCrLf)
BTicks = aRet
Exit Function
End If
Dim nIdx : nIdx = 1
Dim sFSpec
For Each sFSpec In Array(sFSpec2, sFSpec1)
If goFS.FileExists(sFSpec) Then
Dim oFile : Set oFile = goFS.GetFile(sFSpec)
If 0 < oFile.Size Then
aRet(nIdx) = oFile.OpenAsTextStream(ForReading).ReadAll()
End If
oFile.Delete
End If
nIdx = nIdx + 1
Next
BTicks = aRet
End Function
Так как этот файл должен быть включен, и «старые» кнопки не нужны больше, изменения в javacompile.hta
<html>
<head>
<Title>JavaCompile</Title>
<hta:application id="javacompile" scroll = "no">
<script type="text/vbscript" src="javacompile.vbs"></script>
<script type="text/vbscript" src="util.vbs"></script>
</head>
<body>
<form>
<input type="button" id="bttBTicks" value="Use BTicks, Stupid"/>
<form>
</body>
</html>
и javacompile.vbs получает не короче тоже:
Option Explicit
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
' document.location: "file:///E:/trials/SoTrials/answers/19944721/vbs/javacompile.hta"
Dim gsVbsF : gsVbsF = Replace(goFS.GetParentFolderName(Mid(document.location, 9)), "/", "\")
Dim gsJavaF : gsJavaF = goFS.GetAbsolutePathName(goFS.BuildPath(gsVbsF, "..\java"))
Dim gsGoodF : gsGoodF = goFS.BuildPath(gsJavaF, "good")
Dim gsBadF : gsBadF = goFS.BuildPath(gsJavaF, "bad")
Dim goWSH : Set goWSH = CreateObject("WScript.Shell")
Sub bttBTicks_onclick()
MsgBox "Sub bttUseBTicks_onclick() was called."
Dim aRet
aRet = BTicksCompile(gsGoodF, "javac Good.java")
aRet = BTicksCompile(gsGoodF, "bgood.bat")
aRet = BTicksCompile(gsBadF , "javac Bad.java")
aRet = BTicksCompile(gsBadF , "bbad.bat")
End Sub
Function BTicksCompile(sF, sCmd)
BTicksCompile = BTicks(sF, gsVbsF, sCmd)
MsgBox Join(BTicksCompile, vbCrLf & "--------" & vbCrLf)
End Function
Теперь больше нет черных ящиков и последний дисплей (для bbad.bat) показывает волшебное слово FAILURE.
---------------------------
0
--------
Bad.java:4: reached end of file while parsing
}
^
1 error
--------
FAILURE
--------
"%comspec%" /c "bbad.bat 1>"E:\trials\SoTrials\answers\19944721\vbs\rad6CE21.tmp" 2>"E:\trials\SoTrials\answers\19944721\vbs\radC7CE6.tmp""
---------------------------
OK
---------------------------
У вас есть '. ./compile.txt" и Windows использует обратную косую черту. Это влияет на это? – foxidrive
@foxidrive 'FileSystemObject' методы не различают'/'и' '\' '. –
@ansgarwiechers Спасибо за этот комментарий. Я думаю, что некоторые инструменты командной строки не работают с косой чертой, и я не был уверен, что делает VBS. Я замечаю, что многие люди используют косые черты, где нужно использовать обратную косую черту. – foxidrive