目录
■另外一种方式启动执行jar (方式一: RetVal = Shell(cmdStr))---无法获得返回值
■另外一种方式启动执行jar (方式二:WshShell对象 , Run方法)---可以获得返回值
■VBA代码
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub CommandButton1_Click()
Dim cmdStr
cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(cmdStr)
Dim exitCode
exitCode = oExec.exitCode
Do While exitCode = 0
Sleep 3000
exitCode = oExec.exitCode
Loop
Set oStdOut = oExec.StdOut
MsgBox "Return value is : " & exitCode
End Sub
■Java代码
package com.sxz.tool.moveResource;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class StartProcessRun {
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "";
if(args.length == 1){
input= args[0];
}
log.info("hello:" + input);
System.exit(666);
}
}
■运行效果
Excel
===
Log效果 (通过VBA调用jar后,运行,生成的Log)
■课题
当java的处理内容多时,
会一直停留在命令行窗口界面,无法获得正常的返回值。
强制终了后,返回值是【130】
■课题原因(直接原因)
根本原因未知
直接原因是因为使用了log4j,(换成logback也有同样的问题。)
●log4j的配置
===
https://blog.youkuaiyun.com/sxzlc/article/details/124621551
===
■课题验证
在程序开始的时候,循环出力200次log,实际结果只能出力40次。
■课题解决(其他 方式二 实现)
但是为什么这种方式不行,另外一种方式启动执行jar(方式一)(无法获得返回值),可以正常结束。
■另外一种方式启动执行jar (方式一: RetVal = Shell(cmdStr))---无法获得返回值
按钮对应的函数
Private Sub CommandButton1_Click()
Call callJar
End Sub
定义在模块中的方法
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandel As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandel As Long, ByVal dwProcessld As Long) As Long
Public Sub callJar()
Dim cmdStr
cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
RetVal = Shell(cmdStr)
processId = OpenProcess(&H100000, False, RetVal)
r = WaitForSingleObject(processId, -1&)
r = CloseHandle(processId)
End Sub
■另外一种方式启动执行jar (方式二:WshShell对象 , Run方法)---可以获得返回值
这种方式调用,可以获得返回值
不论是是
cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
还是
cmdStr = "cmd /c java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
都可以获得返回值
===
Private Sub CommandButton1_Click()
Dim cmdStr
cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
Set WshShell = CreateObject("WScript.Shell")
Dim endCode As Integer
endCode = WshShell.Run(cmdStr, True, True)
MsgBox endCode
End Sub
■代码简介
===
Run的后两个参数,一个是cmd窗口的风格,一个是是否等待执行完成。
最后一个参数很有用,
如果你希望等待本次cmd执行的程序结束后,再执行run后面的语句,
设置这个参数为true,否则后面的语句将不等待cmd窗口完成,直接运行。
另外,如果你使用exec 方法的时候,
如果希望等待cmd中程序执行完后,再执行后面的语句
需要类似下面的代码
===
Do While exitCode = 0
Sleep 3000
exitCode = oExec.exitCode
Loop
===
===
===
WshShell对象 , Run方法, 详细介绍
' 虽然第二个参数是数字,但是写True也好用,空白时,令行窗口一闪而过,True时,不显示
endCode = WshShell.Run(cmdStr, True, True)
===
VBS
keywords: Run方法, WshShell对象
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
【参数】
object
WshShell 对象。
strCommand
表示要运行的命令行的字符串值。包括要传递到可执行文件的所有参数。
intWindowStyle
可选。表示程序窗口外观的整数值。
请注意,并非所有程序都使用此信息。
bWaitOnReturn
可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。
如果设为 true,则在执行完程序后才执行脚本,Run 方法返回由程序返回的任何错误代码。
如果设为 false(默认值),则 Run 方法将自动在启动程序后立即返回 0(不是错误代码)。
【说明】
Run 方法返回一个整数。Run 方法启动在新 Windows 进程中运行的程序。
可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。
strCommand 参数内的环境变量自动扩展。
如果某个文件类型已正确注册到某个程序中,则对该类型的文件调用 Run 方法时将执行该程序。 例如,如果您的计算机系统中装有 Word,则对 *.doc 文件调用 Run 方法时将启动 Word 并加载该文档。
【intWindowStyle 说明 】
0 隐藏一个窗口并激活另一个窗口。
1 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。
2 激活窗口并将其显示为最小化窗口。
3 激活窗口并将其显示为最大化窗口。
4 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。
5 激活窗口并按当前的大小和位置显示它。
6 最小化指定的窗口,并按照 Z 顺序激活下一个顶部窗口。
7 将窗口显示为最小化窗口。活动窗口保持活动状态。
8 将窗口显示为当前状态。活动窗口保持活动状态。
9 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。
10 根据启动应用程序的程序状态来设置显示状态。
===
■相关知识
1.Maven打包生成jar
POM 打包 Jar,指定Main方法的类,指定使用的JDK_sun0322的博客-优快云博客_pom打包指定main
2.log4J配置使用
https://blog.youkuaiyun.com/sxzlc/article/details/124621551
3.Maven工程做成
Maven的Pom文件 ( Eclipse中创建Maven工程, 使用注意点,DevOps相关)_sun0322的博客-优快云博客_eclipse的pom文件在哪
4.使用Git,管理代码版本
Eclipse中的Git使用之Branch创建,Merge_sun0322的博客-优快云博客
■更多知识
1.Java知识整理
Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)_sun0322的博客-优快云博客
2.软件开发中使用单词
工作中使用到的单词(软件开发)_sun0322的博客-优快云博客_https://10.59.142.4/integration
3.VBA操作相关内容整理
VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件_sun0322的博客-优快云博客_vba中type类型
===