如何将变量名称作为参数的一部分传递给批处理文件然后使用它?

时间:2012-04-19 15:20:27

标签: variables parameters batch-file

我正在尝试运行一个接受包含变量名称的字符串的批处理文件。然后,该变量将用于批处理文件中。例如......

C:\>test.bat user%num%

在批处理文件中......

set num=1
(This is where I need help... Somehow set domainusername=user1)
echo %domainusername%

set num=2
...

这个想法是允许批处理调用以相同的方式工作,无论变量名称在哪里。实例..

C:\>test.bat %num%user
or
C:\>test.bat us%num%er

编辑:
我已经做了大量的研究试图使这项工作。我尝试过的最有希望的想法是for循环以递归计算%1(在示例中)。不幸的是,我无法使其发挥作用。希望这能为其他人带来一些想法。

4 个答案:

答案 0 :(得分:5)

<强> 代码:

@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%

<强> 输出:

user1

答案 1 :(得分:3)

据我了解OP,Aacini和stackoverflow的答案都是错误的。

延迟扩展解决方案(Aacini)只有在启动批处理之前定义num时才有效,否则%mnm%永远不会扩展。

C:\>set "num="

C:\>myBatch.bat user%num%

结果为
的输出 user%num%

另一个(stackoverflow)解决方案效果更好,但在<{1}}定义时失败

我添加了第二个num来演示

set num=2

调用它两次显示问题

@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%

set num=2
CALL SET x=%param%
ECHO %x%

在第二次运行中,您获得C:\>myBatch user%num% user1 user2 C:\>myBatch user%num% user2 user2 两次,因为结果在批次启动时得到修复。

最好回应2的内容,看看 format-string 是否真的存在,或者%1是否已经展开。

据我了解OP(我可能不理解它!),问题是关于使用占位符,
但这对百分比来说很棘手,因为它只适用于命令行(不是来自另一批),只有在那一刻没有定义变量时才有效。 因为,如果定义了变量,那么%num%将立即展开,%num%的内容为%1而不是user2(假设num = 2)。

它有时起作用只是cmd-line解析器的副作用,因为它不会删除未定义的变量(如批处理文件中),而是未定义的变量扩展不会以任何方式更改。

user%num%

但是作为副作用,没有办法在cmd-line上下文中转义百分号 转义只存在一种解决方法 echo "%thisIsUndefined%" - from cmd-line this outputs `"%thisIsUndefined%"` echo "%thisIsUndefined%" - from a batch file this outputs `""`
它并没有真正逃脱百分比,但大多数情况下不存在名为mybatch user%num^%的变量。

然后stackoverlow的解决方案可以使用:

num^

但我会优先考虑Aacini提到的延迟扩张 您可以使用感叹号而不是百分比来调用批处理,通常这样可以正常工作,因为默认情况下禁用延迟扩展。

myBatch user%num^%

批次本身看起来像这样

myBatch user!num!

答案 2 :(得分:1)

对不起。我想我真的不明白你想要什么。然而...

如果将变量的名称传递给批处理文件,您可以直接以这种方式为该变量分配值:

set %1=Any value

如果要获取此类变量的值,则需要使用延迟扩展:在开头插入setlocal EnableDelayedExpansion命令并在变量中包含变量名称(%1参数)标志:

setlocal EnableDelayedExpansion
set varValue=!%1!

在你的情况下,我想你想要实现这样的目标:

set num=1
set domainusername=!user%num%!
echo %domainusername%

但是这并没有像你说的那样使用%1参数,所以我不知道......

我希望它有所帮助...

编辑:也许this post可能对您有用......

附录 :在我意识到OP想要什么之后,这是我的解决方案:

@ECHO off
setlocal EnableDelayedExpansion
SET param=%1
SET num=1
SET x=!param!
ECHO %x%

延迟扩展的执行速度比CALL快......

答案 3 :(得分:0)

作为事后的想法,您可能会考虑在确定变量之前测试该变量。将其添加到程序的开头:

if %1.==. goto :usage_orwherever