2016-07-26 85 views
1

Ich habe 2 Zeilen, die ich mehrmals täglich in cmd ausführen muss. Die Zeilen ähneln denen unten:ausführen Shell Befehl/Batch-Datei mit mehreren Zeilen von VBA

set_someclasspaths.bat 
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard 

Ich habe über zwei Möglichkeiten nachgedacht, dies zu automatisieren. Die erste ist eine Batch-Datei und die zweite ist Senden-Schlüssel. Ich habe eine Datei gemacht, die es als something.bat bezeichnet und in die obigen zwei Zeilen eingefügt hat. Dies öffnet schnell ein Fenster in cmd und schließt wieder (auch wenn ich am Ende pause hinzufüge), und tut nicht, was ich erwarten würde - infact, soweit ich es sagen kann, führt den ersten Befehl dann nichts aus.

Die Sendetasten Methode scheint nur die erste Zeile zu laufen, habe ich versucht:

Sub testcreate() 
Dim wsh As Object 
Set wsh = VBA.CreateObject("WScript.Shell") 
Dim waitOnReturn As Boolean: waitOnReturn = True 
Dim windowStyle As Integer: windowStyle = 1 

wsh.Run "cmd.exe /K C:\a\b\set_someclasspaths.bat", windowStyle, waitOnReturn 
wsh.sendkeys "java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard" 
End Sub 

Meine Batch-Datei und Java-Fähigkeit ist bestenfalls zweifelhaft, es wie der sauberere Weg scheinen würde zu lösen dies ist Batchdatei, also würde ich das lieber machen.

Ich glaube, ich übergebe Parameter an ein Java-Skript in der zweiten Zeile, ich bin nicht sicher, ob es eine Syntax dafür gibt, und ohne etwas Java und Batch-Datei-Sachen zu lernen, bin ich zum Stillstand gekommen.

Um zu klären, meine Frage ist zweifacher: erstens ist die Batch-Datei der bessere Weg, dies zu tun? Zweitens, warum funktioniert das nicht?

Hilfe sehr geschätzt.

Antwort

3

Wenn Sie eine Batch-Datei von einem anderen rufen, die Steuerung an den zweiten übergeben wird und es nicht zurück.

Wenn Sie möchten, dass es zurückgeben, müssen Sie in call passieren, so dass Ihre Batch-Datei wie folgt aussehen:

call set_someclasspaths.bat 
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard 
1

Was:

Sub CreateAndRun() 

Dim batchContents As String 
Dim batchFile  As String 
Dim FF   As Byte 

batchFile = Environ$("USERPROFILE") & "\temp.bat" 

batchContents = "CALL set_someclasspaths.bat" & vbCrLf & _ 
       "java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard" 

FF = FreeFile 

Open batchFile For Output As #FF 
    Print #FF, batchContents 
Close #FF 

CreateObject("WScript.Shell").Run batchFile, 1, True 

DoEvents 

Kill batchFile 

End Sub 
1

Erstellen Sie eine Wrapper-Batch-Datei wie wrapper.bat und fügen Sie Ihre beiden Befehle dort:

call set_someclasspaths.bat 
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard 
pause 

Dies sollte sowohl die Batch-Datei und Ihre Java-Anweisung ausführen und dann das Fenster geöffnet lassen.

Anstatt eine Stapeldatei über VBA ständig zu erstellen, können Sie sie einfach ausführen, wenn Sie auf eine Schaltfläche oder etwas klicken.