【问题标题】:Batch script: local variable from function1 to function2批处理脚本:从函数 1 到函数 2 的局部变量
【发布时间】:2011-01-22 09:49:31
【问题描述】:

好吧,让我试着解释一下我的问题:

我从一行开始,从那里开始 2 个不同的功能

setlocal EnableDelayedExpansion
for %%i in ("C:\*.*") do (
call :function1 "%%~i"
call :function2 "%%~i"
)
goto :eof

在function1中,在某个点我在本地环境中做一个SET:

setlocal EnableDelayedExpansion
...
...
set name1=blabla
endlocal  & SET name=%name1%
echo %name%
goto :eof

回声确实返回了我的变量。现在谈谈我的问题。 我退出功能一并转到功能 2(请参阅第一个代码段) 我不能在这里调用变量形式。我在function2中尝试过,我在调用function2之前尝试过,但都没有解决问题。

我的猜测是只为 function1 设置了一个局部变量。我搜索了网络,但我读到“endlocal & SET name=%name1%”这行应该解决了我的问题。

希望我已经解释清楚,感谢所有帮助!

【问题讨论】:

    标签: windows variables batch-file local


    【解决方案1】:

    我不确定您的问题出在哪里,因为这非常有效:

    @setlocal enableextensions enabledelayedexpansion
    @echo off
    set name=ORIGNAME
    for %%i in (1 2) do (
        call :function1 %%i
        echo in main %name% !name!
    )
    endlocal
    goto :eof
    
    :function1:
        setlocal enableextensions enabledelayedexpansion
        set name1=%1_blabla
        endlocal  & SET name=%name1%
        echo in function %name%
        goto :eof
    

    输出:

    in function 1_blabla
    in main ORIGNAME 1_blabla
    in function 2_blabla
    in main ORIGNAME 2_blabla
    

    确定当你在主要区域使用name时,你使用!name!而不是%name%

    如果您使用%name% 变体,则将在读取整个for 循环时进行评估,而不是在您使用它时进行评估(换句话说,它将是空白的)。您可以在main 行中ORIGNAME 的输出中看到这一点。

    我不确定情况是否如此,因为您正在使用延迟扩展。但是,以防万一,我想我会提到它。我总是使用延迟扩展,并且我总是使用环境变量的 ! 变体,因为它更符合我期望 shell 的工作方式。

    在任何情况下,我提供的代码都可以正常工作,因此您可能需要修改它以查看是否可以将其合并到您自己的代码中。

    【讨论】:

    • 好吧,我不尝试简化版真是太愚蠢了。谢谢你的回答。我将(再次)浏览一下代码,以确保我没有遗漏任何内容。如果我没有找到问题,我会回来;)感谢您的回答 paxdiablo!
    • 我解决了这个问题,将两个函数一个接一个地放置;)。我现在他们不称它为解决问题,而是绕过问题;)
    【解决方案2】:

    首先是一个小的工作样本

    @echo off
    setlocal EnableDelayedExpansion
    
    call :myAdd returnVar 1 2
    echo 1. Percent %returnVar%
    echo 1. Exlcam  !returnVar!
    
    (
    call :myAdd returnVar 4 5
    echo 2. Percent %returnVar%
    echo 2. Exlcam  !returnVar!
    )
    goto :eof
    
    :myAdd
    setlocal
    set /a result=%2 + %3
    
    (
      endlocal
      set %1=%result%
      goto :eof
    )
    
    ---- Output ----
    1. Percent 3
    1. Exlcam  3
    2. Percent 3
    2. Exlcam  9
    

    “2. Percent”错误结果的原因是 %var% 扩展的结果。
    它们在解析时展开,在执行括号块的任何行之前,所以returnVar中有旧值。

    但这也是从函数返回变量起作用的原因。
    endlocal 删除所有局部变量,但块(&符号的工作方式相同) 在执行“endlocal”之前展开。

    用“echo on”测试这个问题是个好主意。

    【讨论】:

    • 对不起,布局被这些盒子搞砸了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多