批量使用非位置参数

时间:2014-11-20 19:41:03

标签: batch-file

我有一个批处理脚本可以驱动一些负载测试,因此用户可以在运行时设置很多参数。这些参数是强制参数和可选参数的混合,因此我现在需要为另一个可选参数添加空间,我将自己画成一个角落。

例如,以下是我传递给批处理脚本以运行正常负载测试的内容:

30run.bat [testrig] [databasetouse] [backupfiletouse] [Collection] [Label] [OPTION1] [OPTION2]

现在,用户只需传入它们,然后根据位置将它们调用为变量,在执行任何操作之前检查是否有空白。

但是,我需要在这里进行一些更改并添加另一个选项,它揭示了位置参数的局限性。有没有办法让这些论点不位置?或者我注定要使用大量嵌套的IF来处理各种选项?

1 个答案:

答案 0 :(得分:1)

您可以使用这种简单的方法:

for %%a in (%*) do set "%%~a=1"

这样,您可以为给定参数定义变量,如果没有,则定义为undefined。例如:

if defined Collection (
   echo Perform Collection processing
) else (
   echo Collection option not specified...
)

编辑:你也可以强迫位置"这样的参数:

@echo off
setlocal EnableDelayedExpansion

set "params=%*"
set "options="
set i=0
for %%a in (testrig databasetouse backupfiletouse Collection Label OPTION1 OPTION2) do (
   set /A i+=1
   if "!params:%%a=!" neq "%params%" set "options=!options!!i!"
)

例如,如果" databasetouse标签OPTION2"以任何顺序给出,选项变量将具有" 257"字符串。


编辑2 添加了另一种方法

解决此问题的另一种方法是通过命名参数(就像JScript中使用的那样)。例如,您可以通过以下方式定义批处理文件的格式:

30run.bat [/T:testrig] [/DB:databasetouse] [/BF:backupfiletouse] [/C:Collection] [/L:Label] [OPTION1] [OPTION2]

获取如下参数:

for %%a in (%*) do (
   set "param=%%~a"
   if "!param:~0,1!" equ "/" (
      rem Named parameter
      for /F "tokens=1* delims=:" %%b in ("!param:~1!") do set "%%b=%%c"
   ) else (
      rem Unnamed parameter (option)
      set "!param!=1"
   )
)

并以这种方式使用参数:

if defined C (
   echo Collection given: "%C%"
) else (
   echo Collection parameter not specified...
)