【问题标题】:Get a variable stored inside of another variable and get the data out of the variable获取存储在另一个变量中的变量并从变量中获取数据
【发布时间】:2021-01-07 14:56:35
【问题描述】:

标题可能令人困惑,但这是我想要做的:

@echo off
set testvar=Hello
call :getvarout testvar
:getvarout
set varout=%~1
echo %%%varout%%%
pause

预期输出: Hello

输出: %testvar%

【问题讨论】:

  • 您发布的示例在任何真正的批处理文件中都没有任何用途,请您重新编写您的问题,以便我们可以针对现实世界的任务解决问题。 在上面的例子中没有理由不使用call :getvarout "%testvar%",或者更简单的set "varout=%testvar%",然后是echo(%varout%。

标签: batch-file


【解决方案1】:

你有类似的想法吗?

@echo off
set testvar=Hello
call :getvarout testvar
goto end

:getvarout
set varout=%~1
call echo %%%varout%%%
pause

:end

【讨论】:

    【解决方案2】:
    @ECHO OFF
    
    SETLOCAL
    set "testvar=Hello"
    call :getvarout testvar
    ECHO varout value is "%varout%"
    GOTO :eof
    
    :getvarout
    set varout=%~1
    CALL SET "varout=%%%varout%%%"
    GOTO :EOF
    

    我相信,练习的目的是检索名称已知的变量的值 - 或者其名称包含在另一个变量中,所以

    call :getvarout %testvar%
    

    将检索变量hello 的值。

    对于 OP: 当您使用点击和傻笑的方法执行批处理时,如果发现语法错误,批处理窗口通常会关闭。您应该改为 open a 'command prompt' 并从那里运行您的批处理,以便窗口保持打开状态并显示任何错误消息。

    使用set "var1=data" 设置值 - 这样可以避免尾随空格引起的问题。在比较中,使用if "thing1" == "thing2" ... 可以避免由于thing1/2 中的空格引起的问题。

    关于原始代码:

    与许多语言不同,批处理没有“过程”结尾的概念 - 它只是逐行继续执行,直到到达文件结尾。因此,您需要在完成主线后goto :eof,否则将通过子程序代码继续执行。 :EOF 是一个预定义标签,CMD 理解为表示 end of file。冒号是必需的。

    【讨论】:

      【解决方案3】:

      您可以使用延迟扩展来允许嵌套变量的扩展,如下所示:

       Setlocal enabledelayedexpansion
       Echo(!%varout%!
      

      或者使用Call 命令和Echo 来强制解析器进行额外的一轮扩展,使用:

       Call Echo(%%varout%%
      

      上述调用方法效率较低,但如果变量可能包含感叹号,则它是一种替代方法。

      通过使用调用,可以在不断增加的深度级别上扩展变量,直到发现变量为空。限制在于行长度限制,因为需要用于扩展变量的 % 扩展数量与用于解析变量的调用数量成正比,以实现每个扩展级别。

      以下规则适用于使用 Call 的扩展深度:

      • E(转义 % 扩展)从值 1 开始,并与 C 成比例增加,如下所示:
      • E = ( C * 4 ) -1
      • C 的值(解析变量所需的调用)从 0 开始,第二次扩展时加 1,然后每次后续扩展时加倍

      【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多