将字符串转换为现有变量的名称以在批处理中使用var值

时间:2014-09-10 04:07:08

标签: string variables batch-file

我正在使用现有变量的名称生成字符串。我想使用字符串创建一个设置为现有变量的VALUE的变量,但我无法弄清楚如何实现这一点。

如果有帮助,请采用另一种方式: 调用例程发送字符串“abc”“cde”等...每个字符串是我已经设置的路径变量的前几个字符。然后我将“path”附加到传递的字符串以创建现有变量的全名(例如,%abcpath%)现在我想获取%abcpath%的值并将其放入变量中我可以在当前使用它常规。

感谢您的帮助。

以下是我的代码的一部分:

SET abcPath=c:\path_to_abc_dir
SET cdePath=c:\path_to_cde_dir

call :names abc cde ...

:names
 For %%G in (%*) do (
    set name=%%G
    :: Append "path" to name from calling routine
    set namepath=!name!path
    echo "!namepath!"       
    :: 1st time through namepath is "abcPath"
    :: How to now set a var to the VALUE of %abcPath% set above?

    ::these don't work:
    set dirpath=%%namepath%%
    set dirpath=!%%namepath%%!
    set dirpath=!%namepath%%%amepath%%!
    set dirpath=!!name!path:%dirpath%=%%dirpath%%!

   ::I want to do things with %dirpath% in this routine:
    if not "!dirpath!"=="" (
        cd !dirpath!
        :: call subroutine to get the number of files in the directory
        call :forhere

        do other stuff with var dirpath ...
    )
)

1 个答案:

答案 0 :(得分:3)

....
::these don't work:
set dirpath=%%namepath%%
            ^^........^^  Not a valid variable reference

set dirpath=!%%namepath%%!
             ^^........^^ Not a valid variable reference 

set dirpath=!%namepath%%%amepath%%!
             ^........^          This has been parsed at start and has no value

set dirpath=!!name!path:%dirpath%=%%dirpath%%!
            ^^    ^..........................^ two "variables" start and end

通过延迟扩展获得的值的延迟扩展没有明显的语法,因为这不存在。它无法直接完成,需要使用其他命令

....
set "name=%%G"
set "namepath=%%Gpath"

call set "dirpath=%%!namepath!%%"

echo !dirpath!
....

为什么或如何运作?

解析行时,引用的唯一变量是namepath,扩展延迟。双百分号是逃脱的百分号。所以该行被翻译成

call set "dirpath=%abcpath%"

现在,执行调用,生成第二行解析,获得正确的值

这也可以作为

完成
for %%a in ("!namepath!") do set "dirpath=!%%~a!"

在这种情况下,namepath变量中的值存储在for可替换参数中,用于获取要分配给dirpath变量的值

在这两种情况下,都完成了两次“解析”(在逻辑意义上)操作。

在第一个解决方案中,第一个解析提取namepath的值,第二个解析(由call命令执行调用)使用该值作为变量名。

在第二个解决方案中,我们首先获取namepath内的值(首先是“解析”),然后在新的延迟扩展操作中使用此值来检索要分配给dirpath <的值/ p>