Windows 批处理脚本:从函数1到函数2的局部变量

Windows 批处理脚本:从函数1到函数2的局部变量,windows,variables,batch-file,local,Windows,Variables,Batch File,Local,好了,伙计们,让我试着解释一下我的问题: 我从一行开始,从这里开始两个不同的函数 setlocal EnableDelayedExpansion for %%i in ("C:\*.*") do ( call :function1 "%%~i" call :function2 "%%~i" ) goto :eof 在function1中,在某一点上,我在本地环境中进行设置: setlocal EnableDelayedExpansion ... ... set name1=blabla end

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

我从一行开始,从这里开始两个不同的函数

setlocal EnableDelayedExpansion
for %%i in ("C:\*.*") do (
call :function1 "%%~i"
call :function2 "%%~i"
)
goto :eof
在function1中,在某一点上,我在本地环境中进行设置:

setlocal EnableDelayedExpansion
...
...
set name1=blabla
endlocal  & SET name=%name1%
echo %name%
goto :eof
echo确实返回了我的变量。现在谈谈我的问题。 我退出函数1,进入函数2,参见第一个代码段 我不能在这里调用变量形式。我在function2中尝试过,在调用function2之前尝试过,但两者都没有解决问题

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


我希望我解释得很好,谢谢大家的帮助

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

@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%变量,则在读取整个for循环时将对其进行计算,而不是在使用它时,换句话说,它将为空。您可以在主线的ORIGNAME输出中看到这一点

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


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

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

@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%变量,则在读取整个for循环时将对其进行计算,而不是在使用它时,换句话说,它将为空。您可以在主线的ORIGNAME输出中看到这一点

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


在任何情况下,我给出的代码都可以很好地工作,因此您可能需要修改它,看看是否可以将其合并到您自己的代码中。

首先是一个小的工作示例

@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测试此问题是一个好主意。

首先是一个小的工作示例

@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上测试这个问题是个好主意。

好吧,我没有尝试简化版本真是太愚蠢了。谢谢你的回答。我将再次浏览代码,以确保没有遗漏任何内容。如果我找不到问题,我会回来;谢谢你的回答,帕斯迪亚布洛!通过将这两个函数一个接一个地放置,我解决了isue问题;。我现在知道,他们不是说这是为了解决问题,而是为了绕开问题;好吧,愚蠢的我没有尝试简化版。谢谢你的回答。我将再次浏览代码,以确保没有遗漏任何内容。如果我找不到问题,我会回来;谢谢你的回答,帕斯迪亚布洛!通过将这两个函数一个接一个地放置,我解决了isue问题;。我现在知道,他们不是说这是为了解决问题,而是为了绕开问题;对不起,布局是用螺丝钉固定在这些盒子里的