一次单击,使用不同的参数多次运行应用程序

时间:2015-01-29 16:14:54

标签: c batch-file cygwin bulk

我尝试做的是在Cygwin中多次运行相同的程序,但传递了不同的参数。

我尝试做的事情如下

./ssltest.exe -3 -p STATIC_PORT STATIC_IP && ./ssltest.exe -p STATIC_PORT STATIC_IP && ./ssltest.exe -1 -p STATIC_PORT STATIC_IP && ./ssltest.exe -2 -p STATIC_PORT STATIC_IP

但是看起来像这样的东西

./bulkssltest.exe -p STATIC_PORT STATIC_IP

并呈现相同的结果。如您所见,端口和IP保持不变,但我使用-1-2-3并且没有其他参数运行它。

代码对我来说太复杂了,无法编辑它以达到相同的效果,但我很确定有办法让它以某种方式工作。

任何意见都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

&符运算符控制命令管道。如果前一个命令完成OK,它将只运行每个后续命令(即:返回0)。我认为您打算使用分号;,它将运行每个命令,无论前一个命令如何退出。

./ssltest.exe -3 -p STATIC_PORT STATIC_IP ; \
./ssltest.exe -p STATIC_PORT STATIC_IP ; \
./ssltest.exe -1 -p STATIC_PORT STATIC_IP ; \
./ssltest.exe -2 -p STATIC_PORT STATIC_IP

仅供参考 - 我添加了反斜杠行延续字符以使示例可读。您将此命令全部放在一行(只需删除反斜杠)

答案 1 :(得分:0)

Cygwin的Shell脚本

将以下内容放入文件中,例如bulkssltest.sh

#!/bin/sh

for opt in -3 "" -1 -2; do
  # Intentionally unquoted $opt here, so that the empty opt disappears
  # and is not expanded into the empty string (that ssltest doesn't expect)
  # You might want to use an absolute path to ssltest.exe here.
  ./ssltest.exe $opt "$@" || break
done

确保该文件包含UNIX行结尾/bin/sh会抱怨$\r: command not found.及类似内容。这里的诀窍是"$@"扩展到传递给脚本的参数,并且稍微不同寻常地使用循环变量$opt使其在空字符串时消失。 break退出循环,如果ssltest返回非零退出状态(||执行的操作; &&'或chmod +x bulkssltest.sh ',则会调用此处s和)。

然后:

./bulkssltest.sh -p STATIC_PORT STATIC_IP

然后:

bulkssltest.bat

或者,对于纯Windows:

不幸的是,在批处理文件中循环是很麻烦的,就像快捷方式一样,我还没有找到一种方法将空标记扩展到我在上面的shell脚本中所做的任何事情,所以要产生精确的结果作为你发布的表达方式,你必须重复自己。例如,将其放入文件@echo off ssltest -3 %* IF NOT %ErrorLevel% EQU 0 GOTO end ssltest %* IF NOT %ErrorLevel% EQU 0 GOTO end FOR %%O IN (-2,-1) DO (ssltest %%O %* & IF NOT %ErrorLevel% EQU 0 GOTO end) :end

bulkssltest -p STATIC_PORT STATIC_IP

并运行

FOR

此处包含ssltest循环以用于说明目的;当然,你可以像前两个一样对cmd进行最后两次调用。请注意,您不能将此循环分成几行; -3不会拥有它。如果执行顺序无关紧要,您可以将%*的调用折叠到循环中并保存一些行,但我认为空令牌不可能。这里%ErrorLevel扩展为批处理文件的参数,$?是最近执行的程序的退出状态(类似于shell脚本中的:end),并且{{1}}是跳转标签。

如果你想使用板载Windows工具做更复杂的事情,我建议你研究一下powershell。批处理文件没有任何改善。