首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中从批处理文件运行多个cmd.exe进程

在Java中从批处理文件运行多个cmd.exe进程
EN

Stack Overflow用户
提问于 2014-11-18 06:23:20
回答 1查看 673关注 0票数 0

目前,我正在修改我编写的一个小应用程序,作为我正在修的安全课程的演示。教授喜欢它,并要求一些修改,我无法弄清楚。我想将代码中的几个变量(即要运行的cmd.exe实例的数量和下面的代码中的消息变量)作为参数传递到批处理文件中。

使用在从单个批处理文件启动多个shell提示找到的答案以及其他有用的SO线程,下面是我将代码放在一起的示例:

批处理文件:

代码语言:javascript
运行
复制
@echo off

if not "%1" == "" goto :%1

SET message="The random number is: "

SET /a rand=%RANDOM%

start "Job 1" "%~dpfx0" job1
start "Job 2" "%~dpfx0" job2
start "Job 3" "%~dpfx0" job3
goto :eof

:job1
call :showMessage %message% %rand%

:job2
call :showMessage %message% %rand%

:job3
call :showMessage %message% %rand%

:showMessage 
echo %~1 %~2

这对生成3个cmd.exe实例非常有用。但是,对于如何动态选择要运行的作业数量以及如何将变量传递给具有上述配置的批处理文件,我感到很困惑。我想我需要一个FOR循环,但是我不确定如何使用上面的设置或一种全新的方法来完成它。

我确信批处理文件中的行“如果不是"%1”== "“goto :%1”是绝对必要的,因为没有它,系统将持续打开cmd.exe进程(实验导致了几次硬重置)。它会干扰将参数传递到批处理文件,但我无法找到使用它的方法。

供参考:

批处理文件是通过以下代码在Java中执行的:

代码语言:javascript
运行
复制
public class CmdProcess{
    Runtime rt;

    public cmdProcess() {
        rt = Runtime.getRuntime();
    }

    public void startSpawning() {
        try {
            rt.exec("cmd.exe /C example.bat");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我使用以下监听器从gui代码中调用这个类:

代码语言:javascript
运行
复制
private void setupListeners() {
    class spawnButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent ae) {
            // Fire off 3 cmd.exe processes that show a message
            CmdProcess proc = new CmdProcess ();
            proc.startSpawning();
            // Increment the local counter and display on the client
            processCounter += 3;
            processCounterTextField.setText(Integer.toString(processCounter));
            }
        }

tl;dr:我需要知道在使用执行的批处理文件中是否可以使用DOS魔术传递运行任意数量的cmd.exe实例所需的参数,这些实例将执行相同的命令。

编辑以包含解决方案:基于@JosefZ输入的,下面是我需要它的工作方式:

代码语言:javascript
运行
复制
@echo off
if not %1 == "" (
    set /A noiter=%1
    ) Else (
    set /A noiter=1
    )

SET message="The random number is: "

SET /a rand=%RANDOM%

if %noiter% == 0 (
    call :showMessage %message% %rand%
    ) Else (
    For /L %%G IN (1, 1, %noiter%) do (
        start "Job %%G" "%~dpfx0" job%%G
        set /a rand=%RANDOM%
        :job%%G
        call :showMessage %message% %rand%
        )
    )
)

:showMessage
echo %~1 %~2

如果我想传递额外的参数,我会在第一个If块中处理它们.

代码语言:javascript
运行
复制
@echo off
if not %1 == "" (
    rem passed in parameters
    set /A noiter=%1
    set /A message=%2
    set /A rand=%3
    ) Else (
    rem default parameters
    set /A noiter=1
    set message="The random number is: "
    set /a rand=%RANDOM%
    )
EN

Stack Overflow用户

回答已采纳

发布于 2014-11-18 19:42:57

你知道我们可以用参数调用脚本。让我们按如下方式检查这个参数:如果它是一个数值,那么考虑这是要启动的cmd.exe的实例计数,并将它记住为一个数值环境变量:set /A "noiter=%1";否则它只是一个结束标志。下面是代码:

代码语言:javascript
运行
复制
if not "%1" == "" (
  set /A "noiter=%1"
) Else (
  set /A "noiter=1"
)

试一试set /A "noiter=text"的效果。现在我们可以测试noiter变量的值了:

代码语言:javascript
运行
复制
if "%noiter%" == "0" (
  call :showMessage %message% %rand%
) Else (
  rem loop here
)

最后,用下面的代码片段代替上面的rem loop here

代码语言:javascript
运行
复制
  rem loop from 1 stepping 1 to "noiter"
  For /L %%G IN (1, 1, %noiter%) do (
    rem for testing purposes only: echo our command line first  
    echo start "Job %%G" "%~dpnx0" job%%G
    rem for testing purposes only: simulate real call
    set /a "rand=%RANDOM%"
    call :showMessage %message% %rand%
  )

这只是一个原始的蓝图;仍然存在一些问题:例如%random%倾向于保持不变:-)

因此,了解更多关于set命令集局部enabledelayedexpansion等方面的知识。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26987929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档