批处理脚本:从function1到function2的局部变量

时间:2011-01-22 09:49:32

标签: windows variables batch-file local

好的伙计们,让我尝试解释一下我的问题:

我从一个开始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

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

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

我希望我已经解释得很好,所有人都非常感谢!

2 个答案:

答案 0 :(得分:2)

我不确定你的问题在哪里,因为它完美无缺:

@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循环时进行评估,而不是在您使用它时(换句话说,它将为空白)。您可以在ORIGNAME行的main输出中看到。

我不确定是否属于这种情况,因为 使用延迟扩展。但是,为了以防万一,我以为我会提到它。我总是使用延迟扩展,而我总是使用环境变量的!变体,因为它更符合我期望shell工作的方式。

在任何情况下,我给出的代码都可以正常工作,因此您可能想要弄清楚它是否可以将其合并到您自己的代码中。

答案 1 :(得分: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.百分比”错误结果的原因是%var%扩大的结果 它们在解析时被扩展,在执行括号块的任何行之前,因此在returnVar中存在旧值。

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

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