使用VBA中的多行运行Shell命令/批处理文件



我有两行,每天都要在cmd中多次运行。线条类似于以下线条:

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

我想了两种方法来实现自动化。第一个是批处理文件,第二个是发送密钥。我做了一个文件,上面写着"什么东西",粘贴在上面两行。这很快在cmd中打开了一个窗口,然后再次关闭(即使我在最后添加了暂停),但并没有达到我的预期——据我所知,实际上它运行了第一个命令,然后什么都没有。

发送密钥的方法似乎只运行第一行,我已经尝试过:

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:abset_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

我的批处理文件和java能力充其量是可疑的,解决这个问题的更整洁的方法似乎是批处理文件,所以我更喜欢这样做。

我想我在第二行将参数传递给一个java脚本,我不确定是否有语法,而且在没有学习一些java和批处理文件的情况下,我已经停了下来。

为了澄清,我的问题有两个:第一,批处理文件是更好的方法吗?第二,为什么不起作用?

非常感谢您的帮助。

当您从另一个批处理文件调用一个时,控制权会传递给第二个,它不会返回。

如果你想让它返回,你需要传入call,所以你的批处理文件看起来像这样:

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

关于:

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

创建一个类似wrapper.bat的包装批处理文件,并将您的两个命令粘贴到其中:

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

这应该同时执行批处理文件和java语句,然后保持窗口打开。

不必一直通过VBA创建批处理文件,只需在单击按钮或其他东西时执行即可。

最新更新