好的伙计们,让我尝试解释一下我的问题:
我从一个开始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%”这一行应该解决了我的问题。
我希望我已经解释得很好,所有人都非常感谢!
答案 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”测试这个问题是个好主意。