Windows批处理脚本 - 反转函数参数

时间:2018-03-20 17:49:55

标签: function batch-file

我想将一堆布尔标志传递给Windows批处理脚本函数。像这样:

1   SETLOCAL
2   SET _debug=1
3   SET _x64=1
4   
5   call :COMPILE %_debug% %_x64%
6   :: call again where %_debug% is now 0
7   :: call again where %_x64% is now 0
8   :: etc...
9   
10  :COMPILE
11  :: stuff depending on input args

我使用变量_debug_x64来使调用(第5-7行)更具可读性,而不是像这样:

call :COMPILE 0 1

是否有一种简单的方法可以传递等效的not variable?像:

call :COMPILE ~%_debug% ~%_64%

call :COMPILE (%_debug% eq 1) (%_64% eq 1)

或者我必须声明 - 变量如:

SET _debug=1
SET _not_debug=0
SET _x64=1
SET _not_x64=0

当我只有这两个变量时,这很容易,但我预计会有更多变量。

<小时/> 根据初始回复进行编辑

关于第6和第7行,我写道:

6   :: call again where %_debug% is now 0
7   :: call again where %_x64% is now 0

我对实际将_debug_x64的值更改为0不感兴趣。我想知道的是,是否有办法传递&#34;而不是_var&#34;到功能。这样我就可以保留论证的含义。

2 个答案:

答案 0 :(得分:5)

您可以最小化设置各种变量所需的代码:

for %%V in (debug x64) do set /a _%%V=1, _not_%%V=0

对于只有两个带四个值的标志,上面做这些似乎很愚蠢。但随着你添加更多旗帜,它变得越来越有吸引力。

但我不明白为什么你不采取更进一步的措施 - 为什么不让你的例程期望有意义的文本参数而不是神秘的整数值。您的CALL不仅会被很好地记录下来,而且常规代码也会更容易理解。 CALLer不再需要担心将有意义的文本转换为整数值。

如果您发现自己使用可选参数开发复杂例程,那么您应该查看https://stackoverflow.com/a/8162578/1012053

答案 1 :(得分:2)

不幸的是,在任意命令行中无法进行任何类型的(位)算术运算,因此您必须始终使用临时变量和set /A command

:: ...
call :COMPILE %_debug% %_x64%
set /A "_not_debug=!_debug, _not_x64=!_x64"
call :COMPILE %_not_debug% %_not_x64%
:: ...