传递参数使用开关到批处理文件中

6

如何显示与A和B开关相关联的值,而不考虑指定A和B的顺序?

考虑对批处理文件ParamTest.cmd的以下调用:

C:\Paramtest.cmd \A valueA \B valueB

这是C:\Paramtest.cmd文件的内容:
ECHO Param1=%1
ECHO Param2=%2

ECHO Param3=%3
ECHO Param4=%4

输出:

Param1=\A 
Param2=valueA
Param3=\B
Param4=valueB

我希望能够根据开关名称A和B来识别传递的个值,而不管这些开关的顺序如何。例如,如果我执行以下调用:
C:\Paramtest.cmd \B valueB \A valueA

我希望能够展示

A=ValueA
B=ValueB

即使我以参数顺序交换的方式调用批处理文件,也希望获得相同的输出:

C:\Paramtest.cmd \B valueB \A valueA

我该如何实现这一点?


1
你最好使用真正的编程语言来完成这个任务,或者降低你对批处理的期望。 - David Heffernan
https://dev59.com/0nRA5IYBdhLWcg3w_C4w - ethrbunny
1
顺便说一下,通常使用正斜杠(/)作为参数前缀比反斜杠(\\)更典型。当然你不必像其他人一样。 - Andriy M
1个回答

9
简而言之,您需要定义一个循环,并按成对的方式处理参数。
我通常使用标签和GOTO以及SHIFT等方法来处理参数列表,基本上是这样的:
…
SET ArgA=default for A
SET ArgB=default for B

:loop
IF [%1] == [] GOTO continue
IF [%1] == [/A] …
IF [%1] == [/B] …
SHIFT & GOTO loop

:continue
…

还可以使用%*掩码和FOR循环来处理参数,例如:

…
SET ArgA=default for A
SET ArgB=default for B

FOR %%p IN (%*) DO (
  IF [%%p] == [/A] …
  IF [%%p] == [/B] …
)
…

但对于你的情况来说,需要成对处理参数,这会让事情变得有点困难。在我看来,第一种方法更加灵活。


&符号有什么作用?我似乎找不到相关文档。 - Kyle Delaney
1
@KyleDelaney:这是一个命令分隔符。通常在批处理脚本中,您会将不同的命令放在单独的行上。当您将它们放在同一行时,可以使用“&”符号将它们分开。 - Andriy M
1
终于找到文档了:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490954(v=technet.10) - Kyle Delaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接