使用VBA中的多行运行Shell命令/批处理文件
我有2行,我必须每天在cmd运行多次。这些线条与下面的相似:使用VBA中的多行运行Shell命令/批处理文件,vba,excel,batch-file,cmd,Vba,Excel,Batch File,Cmd,我有2行,我必须每天在cmd运行多次。这些线条与下面的相似: set_someclasspaths.bat java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard 我想到了两种方法来实现自动化。第一个是批处理文件,第二个是发送密钥。我制作了一个文件,将其标记为something.bat并粘贴在上面两行。这会很快在cmd中
set_someclasspaths.bat
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard
我想到了两种方法来实现自动化。第一个是批处理文件,第二个是发送密钥。我制作了一个文件,将其标记为something.bat并粘贴在上面两行。这会很快在cmd中打开一个窗口,然后再次关闭,即使我在末尾添加了暂停,也不会执行我预期的操作-事实上,据我所知,它运行第一个命令,然后什么也不运行
send keys方法似乎只运行第一行,我尝试过:
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
我的批处理文件和java能力充其量是值得怀疑的,解决这个问题的更简洁的方法似乎是批处理文件,所以我更愿意这样做
我猜我在第二行将参数传递给java脚本,我不确定是否有语法,在没有学习一些java和批处理文件的情况下,我已经停下来了
为了澄清,我的问题有两个:第一,批处理文件是更好的方法吗?第二,为什么这不起作用
非常感谢您的帮助。关于:
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
那么:
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
当您从另一个批处理文件调用一个批处理文件时,控件将传递给第二个批处理文件,并且不会返回 如果希望返回,则需要传入调用,因此批处理文件如下所示:
call set_someclasspaths.bat
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard
当您从另一个批处理文件调用一个批处理文件时,控件将传递给第二个批处理文件,并且不会返回 如果希望返回,则需要传入调用,因此批处理文件如下所示:
call set_someclasspaths.bat
java -Xmx1024m foo.bar.stuff.Dashboard -var varone -from 20160701 -to 20160731 -outputdir c:\stuff -ir @ -dashboard
创建类似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创建批处理文件,只需单击按钮或其他东西即可执行批处理文件。创建一个类似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创建批处理文件,只需在单击按钮或其他东西时执行即可