目前,我正在修改我编写的一个小应用程序,作为我正在修的安全课程的演示。教授喜欢它,并要求一些修改,我无法弄清楚。我想将代码中的几个变量(即要运行的cmd.exe实例的数量和下面的代码中的消息变量)作为参数传递到批处理文件中。
使用在从单个批处理文件启动多个shell提示找到的答案以及其他有用的SO线程,下面是我将代码放在一起的示例:
批处理文件:
@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中执行的:
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:我需要知道在使用执行的批处理文件中是否可以使用DOS魔术传递运行任意数量的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%
)发布于 2014-11-18 19:42:57
你知道我们可以用参数调用脚本。让我们按如下方式检查这个参数:如果它是一个数值,那么考虑这是要启动的cmd.exe的实例计数,并将它记住为一个数值环境变量:set /A "noiter=%1";否则它只是一个结束标志。下面是代码:
if not "%1" == "" (
set /A "noiter=%1"
) Else (
set /A "noiter=1"
)试一试set /A "noiter=text"的效果。现在我们可以测试noiter变量的值了:
if "%noiter%" == "0" (
call :showMessage %message% %rand%
) Else (
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命令、集局部、enabledelayedexpansion等方面的知识。
https://stackoverflow.com/questions/26987929
复制相似问题