【发布时间】:2020-01-10 13:11:42
【问题描述】:
我已经阅读了很多关于使用变量从批处理函数返回值的示例和问题,但我无法强制 Windows 7 x64 cmd.exe 为我执行此操作。 ;-)
我已经尝试了很多代码示例,但都没有达到我的预期。我编写了一个简短的批处理程序来了解如何做到这一点,但它也没有像我预期的那样工作。我找不到我做错了什么。
@echo off
SetLocal EnableDelayedExpansion
set x=10
echo x(1) = !x!
call :TestFunc !x!
echo x(2) = !x!
EndLocal
exit /b
:TestFunc
SetLocal EnableDelayedExpansion
set a=%~1
echo a(1) = !a!
set /a a=a+101
echo a(2) = !a!
set %~1=!a!
echo %%~1 = %~1
echo ^^!%%~1^^! = !%~1!
EndLocal
exit /b
我预计set %1=!a! 将设置由:TestFunc 返回的唯一变量。但结果是:
>test_variables.bat
x(1) = 10
a(1) = 10
a(2) = 111
%~1 = 10
!%~1! = 111
x(2) = 10
对我来说最令人惊讶的是%~1 的主体内部有两个变量:TestFunc - 一个是在本地设置的,另一个是传递给函数,也可能由函数返回,但没有改变在函数体内。
编辑
最后,感谢@Stephan,我的例子很有效:
@echo off
rem echo on
SetLocal EnableDelayedExpansion
set "x=10"
set "y=x"
echo x(1) = !x!
echo y(1) = !y!
call :TestFunc !y! !x!
echo ---------------------------------
echo x(2) = !x!
echo y(2) = !y!
EndLocal
exit /b
:TestFunc
SetLocal EnableDelayedExpansion
set a=%~2
echo a(1) = !a!
set /a a=!a!+101
echo a(2) = !a!
EndLocal & set "%~1=%a%"
exit /b
结果:
>test_variables.bat
x(1) = 10
y(1) = x
a(1) = 10
a(2) = 111
---------------------------------
x(2) = 111
y(2) = x
有两个技巧可以做:
- 将第一个变量名 (x) 放入另一个变量 (y) 值中,并以两个变量名作为参数调用函数
- @Stephan 在
EndLocal子句 (EndLocal & set "%~1=%a%") 之后设置返回变量值的技巧。
【问题讨论】:
-
由于使用 setlocal/endlocal nothing 从
:TestFunc返回 - 另一个方面由 Stephan 回答 -
我错过了
setlocal/endlocalthing。答案改编。 (谢谢,@LotPings)
标签: batch-file variables windows-7