2013-11-13 2 views
0

Я должен выполнить пакетный файл, используя прогон и получить вывод в текстовый файл и искать файл для строки кода сниппета, как показано ниже,чтение текстового файла после выполнения пакетного файла через VBScript

Для запуска летучая мышь файл

Set objShell = WScript.CreateObject("WScript.Shell") 
MsgBox("Compiling Source files..Please wait..") 
objShell.Run CHR(34) & ".\lib\Compile.bat" & CHR(34) & " > compile.txt" & CHR(34), 0 ,True 

я узнал, что исполнение не собирается на следующую строку после запуска, но если я в конечном процесс cmd.exe в диспетчере задач выполнение происходит.

Я упомянул верно ждать процесс, чтобы получить полные после этого Читает, как показано ниже,

Dim objFSO, strLine, objReadFile 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objReadFile = objFSO.OpenTextFile("./compile.txt", 1 , true) 
Do Until objReadFile.AtEndOfStream 
strLine = objReadFile.ReadLine 
    .... 
    .... 

Как когда-либо compile.bat выполняется и compile.txt становится создан, но процесс чтения Безразлично Слушай. Если я удалю «true» из команды run, то при получении ошибки «файл compile.txt не существует».

Я не знаю, где я сделать ошибку, пожалуйста, помогите мне с этим ..

+0

У вас есть '. ./compile.txt" и Windows использует обратную косую черту. Это влияет на это? – foxidrive

+0

@foxidrive 'FileSystemObject' методы не различают'/'и' '\' '. –

+0

@ansgarwiechers Спасибо за этот комментарий. Я думаю, что некоторые инструменты командной строки не работают с косой чертой, и я не был уверен, что делает VBS. Я замечаю, что многие люди используют косые черты, где нужно использовать обратную косую черту. – foxidrive

ответ

0

Вы можете указать абсолютные пути?

Если вы используете true аргумент для objFSO.OpenTextFile то он будет создать файл, если он не найден. Я не понимаю, почему в вашем случае вы хотели бы это сделать, и это объясняет, почему вы не читаете файл. Если бы вы только что создали его где-то, он был бы пуст.

Если вы знаете, что compile.bat создает текстовый файл, следующий шаг - выяснить, почему OpenTextFile не находит его. Если вы используете абсолютные пути, вы можете быстро решить эту проблему.

Если абсолютные пути не являются опцией, используйте MsgBox WScript.ScriptFullName или что-то, чтобы проверить путь, из которого выполняется скрипт.

Вы также могли бы сделать что-то подобное, что бы использовать относительный путь погонных расположения сценария
strPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"")
objShell.Run ".\lib\Compile.bat" & " > " & strPath & "compile.txt", 0 ,True
Set objReadFile = objFSO.OpenTextFile(strPath & "compile.txt",1)

1

Из всех вопросов, которые я считать историю позади вашей проблемы идет что-то вроде этого:

Ваш босс, г-н Д. Вейдер, попросил вас разработать систему сборки для своего приложения 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 
--------------------------- 
+0

+1 если только для повествования.^_ ^ –

Смежные вопросы