繁体   English   中英

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

[英]Running multiple cmd.exe processes from a batch file in Java

我目前正在修改一个小应用程序,该应用程序是我正在学习的安全课程的演示。 教授喜欢它,要求进行一些我不知道的修改。 我想添加从我的代码中将一些变量作为参数传递给批处理文件的功能(即要运行的cmd.exe实例数,以及下面的代码中的message变量)。

使用在其他有用的SO线程中从单个批处理文件启动多个shell提示中找到的答案,这是我整理的代码示例:

批处理文件:

@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循环,但是我不确定如何通过上述设置或完全采用新方法来实现。

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

以供参考:

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

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代码使用以下侦听器调用此类:

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 :我需要知道用Java执行的批处理文件中的DOS magic是否有可能传递运行任意数量的cmd.exe实例所需的参数,这些实例将各自执行相同的命令。

编辑以包含解决方案:根据@JosefZ的输入,以下是一种解决方案,该解决方案可以满足我的需要:

@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块中处理它们。

@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%
    )

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

if not "%1" == "" (
  set /A "noiter=%1"
) Else (
  set /A "noiter=1"
)

set /A "noiter=text" yoursef的效果进行采样。 现在我们可以测试noiter变量的值:

if "%noiter%" == "0" (
  call :showMessage %message% %rand%
) Else (
  rem loop here
)

最后,在rem loop here用下一个代码段代替上面的rem loop here

  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命令setlocalenabledelayedexpansion等的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM