Вы можете запустить Excel, открыть книгу и запустить макрос из файла VBScript.
Скопировать код в блокнот.
Обновить ' MyWorkbook.xls 'и' MyMacro '.
Сохраните его с расширением vbs и запустите его.
Option Explicit
On Error Resume Next
ExcelMacroExample
Sub ExcelMacroExample()
Dim xlApp
Dim xlBook
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\MyWorkbook.xls", 0, True)
xlApp.Run "MyMacro"
xlApp.Quit
Set xlBook = Nothing
Set xlApp = Nothing
End Sub
Строка ключа, которая запускается макрос:
xlApp.Run «MyMacro»
Если вы запустите процесс с помощью приложения Java (например, вызывая Runtime.exec()
или ProcessBuilder.start()
), у вас есть действительная ссылка Process
, и вы можете вызвать метод destroy()
в Process
, чтобы убить этот конкретный процесс.
Но имейте в виду, что если процесс, который вы вызываете, создает новые подпроцессы, они не могут быть завершены (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id = 4770092 ).
С другой стороны, если вы хотите убить внешние процессы (которые вы не вызвали из своего Java-приложения), то одна вещь, которую вы можете сделать, - это позвонить O / Утилиты, которые позволяют вам это делать. Например, вы можете попробовать Runtime.exec()
в команде kill
в Unix / Linux и проверить значения возврата, чтобы убедиться, что приложение было убито или нет (0 означает успех, -1 означает ошибку). Но это, конечно же, сделает вашу платформу приложений зависимой.
В Windows вам, вероятно, придется использовать эту команду
taskkill /F /IM <processname>.exe
, чтобы убить ее принудительно. Таким образом, это будет
Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe")
AFAIU java.lang.Process - это процесс, созданный самой java (например, Runtime.exec ('firefox'))
Вы можете использовать зависящие от системы команды, такие как
Runtime rt = Runtime.getRuntime();
if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1)
rt.exec("taskkill " +....);
else
rt.exec("kill -9 " +....);
Случайно я наткнулся на другой способ сделать силовое убийство в Unix (для тех, кто использует Weblogic). Это дешевле и элегантнее, чем запуск / bin / kill -9 через Runtime.exec ().
import weblogic.nodemanager.util.Platform;
import weblogic.nodemanager.util.ProcessControl;
...
ProcessControl pctl = Platform.getProcessControl();
pctl.killProcess(pid);
И если вы пытаетесь получить pid, вы можете использовать отражение на java.lang.UNIXProcess , например:
Process proc = Runtime.getRuntime().exec(cmdarray, envp);
if (proc instanceof UNIXProcess) {
Field f = proc.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = f.get(proc);
}
Это может быть дефект интерпретатора java, но java на HPUX не убивает -9, а только убивает -TERM.
Я сделал небольшой тест testDestroy.java:
ProcessBuilder pb = new ProcessBuilder(args);
Process process = pb.start();
Thread.sleep(1000);
process.destroy();
process.waitFor();
И вызов:
$ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c 'trap "echo TERM" TERM; sleep 10'
умирает после 10 секунд (не убивается после 1s, как ожидалось) и показывает:
...
[19999] Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo
[19998] kill(19999, SIGTERM) ............................................................................. = 0
...
Выполнение этого же на окнах кажется
На самом деле я нашел исходный код Java - Process.destroy () для Linux , связанная с потоком и реализация openjava, похоже, использует -TERM, что кажется очень неправильным.
Попробуйте:
String command = "killall <your_proccess>";
Process p = Runtime.getRuntime().exec(command);
p.destroy();
, если процесс все еще жив, добавьте:
p.destroyForcibly();
Вы можете убить (SIGTERM) процесс Windows, который был запущен с Java, вызвав метод destroy на объекте Process. Вы также можете убить любые дочерние процессы (начиная с Java 9).
Следующий код запускает командный файл, ждет десять секунд, а затем убивает все подпроцессы и, наконец, убивает сам пакетный процесс.
ProcessBuilder pb = new ProcessBuilder("cmd /c my_script.bat"));
Process p = pb.start();
p.waitFor(10, TimeUnit.SECONDS);
p.descendants().forEach(ph -> {
ph.destroy();
});
p.destroy();