我有一个批处理脚本可以驱动一些负载测试,因此用户可以在运行时设置很多参数。这些参数是强制参数和可选参数的混合,因此我现在需要为另一个可选参数添加空间,我将自己画成一个角落。
例如,以下是我传递给批处理脚本以运行正常负载测试的内容:
30run.bat [testrig] [databasetouse] [backupfiletouse] [Collection] [Label] [OPTION1] [OPTION2]
现在,用户只需传入它们,然后根据位置将它们调用为变量,在执行任何操作之前检查是否有空白。
但是,我需要在这里进行一些更改并添加另一个选项,它揭示了位置参数的局限性。有没有办法让这些论点不位置?或者我注定要使用大量嵌套的IF来处理各种选项?
答案 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...
)