8

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

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

编辑:
我已经做了相当多的研究来尝试完成这项工作。我尝试过的最有希望的想法是递归评估 %1 的 for 循环(在示例中)。不幸的是,我无法让它工作。希望这会激发其他人的一些想法。

4

4 回答 4

6

代码:

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

输出:

user1
于 2012-04-19T17:31:46.083 回答
4

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

(Aacini 的)延迟扩展解决方案只能num在开始批处理之前定义,否则%mnm%永远不会扩展。

C:\>set "num="

C:\>myBatch.bat user%num%

结果到输出
user%num%

另一个解决方案(stackoverflow)工作得更好一些,但在定义时失败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两次,因为结果在批处理启动时是固定的。

回显 的内容%1以查看格式字符串是否真的存在或是否%num%已经扩展是一个好主意。

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

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

echo "%thisIsUndefined%"  - from cmd-line this outputs `"%thisIsUndefined%"`
echo "%thisIsUndefined%"  - from a batch file this outputs `""`

但作为副作用,不存在在命令行上下文中转义百分号的方法。
仅存在一种用于转义的解决方法。
mybatch user%num^%
它并没有真正逃脱百分比,但大多数情况下不会存在名为 的变量num^

然后stackoverlow的解决方案将起作用,具有:

myBatch user%num^%

但我更喜欢 Aacini 提到的延迟扩张。
然后你会用感叹号而不是百分比来调用批处理,通常这很好用,因为默认情况下禁用延迟扩展。

myBatch user!num!

批次本身看起来像这样

@echo off
set "param=%1"
Setlocal EnableDelayedExpansion
set num=1
echo %param%
set num=2
echo %param%
于 2012-04-21T20:43:55.023 回答
1

打扰一下。我想我真的不明白你想要什么。然而...

如果将变量的名称传递给批处理文件,则可以通过以下方式直接为该变量赋值

set %1=Any value

如果要获取此类变量的值,则需要setlocal EnableDelayedExpansion在开头使用延迟扩展:插入命令,并将变量名(%1 参数)用感叹号括起来:

setlocal EnableDelayedExpansion
set varValue=!%1!

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

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

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

我希望它有帮助...

编辑:也许这篇文章可能对你有用......

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

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

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

于 2012-04-19T16:53:34.653 回答
0

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

if %1.==. goto :usage_orwherever
于 2012-04-19T20:45:19.087 回答