我正在尝试运行一个接受包含变量名称的字符串的批处理文件。然后,该变量将用于批处理文件中。例如......
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(在示例中)。不幸的是,我无法使其发挥作用。希望这能为其他人带来一些想法。
答案 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