从调用的批处理文件中接收变量

Receive variable from a called batch file

我这里有两个批处理文件,test.batlen.bat

len.bat 是一个函数,它接收来自 test.bat 的输入,对其进行处理,然后 return 将结果值返回给 test.bat

test.bat

@echo off
setlocal EnableDelayedExpansion
call len tesla
echo !result!
pause

len.bat

@echo off
setlocal EnableDelayedExpansion
set "string=%~1"
for /l %%a in (0,1,10000) do if "!string:~%%a,1!" == "" (
    set result=%%a
    exit /b
)

当我打开 test.bat 时,我希望它会打印一个值。相反,它说 Echo 已关闭。 将变量从 len.bat 传递到 test.bat 似乎有问题。

setlocal 可以被认为是一个沙箱,只要沙箱存在,在沙箱内创建的任何东西都会存在。当 endlocal 被调用时,沙箱停止存在 - 显式或隐式地在脚本结束时。

len.bat 中,您使用第二个 setlocal enabledelayedexpansion 命令在沙箱内部添加沙箱,并在该内部沙箱内部创建 !result!。当 len.bat 结束时,!result! 被销毁,因为它在调用 len.bat 之前不存在。

我怀疑你添加第二个setlocal enabledelayedexpansion是因为你认为它需要在len.bat内部使用延迟扩展,但延迟扩展实际上仍然启用,因为它在[=]中打开21=].

len.bat 中删除 setlocal enabledelayedexpansion 并且 test.bat 将正确 return "5".

如果您觉得需要将 setlocal enabledelayedexpansion 保留在 len.bat 中以便与 test.bat 分开使用,您可以显式调用 endlocal 并链接 set 命令它欺骗解释器让变量逃离沙箱。

@echo off
setlocal EnableDelayedExpansion
set "string=%~1"
for /l %%a in (0,1,10000) do if "!string:~%%a,1!" == "" (
    endlocal & set result=%%a
    exit /b
)

这对您有帮助吗?字符串长度返回为 %ErrorLevel%:

新建len.bat

@Set "str=#%~1" & SetLocal EnableDelayedExpansion
@Set "len=0" & For /L %%G In (12,-1,0) Do @(Set /A "len |= 1 << %%G"
    For %%H In (!len!) Do @If "!str:~%%H,1!" == "" Set /A "len &= ~ 1 << %%G")
@EndLocal & Exit /B %len%

示例test.bat

@Call "len.bat" four
@Echo %ErrorLevel% & Pause
@Call "len.bat" "nineteen inc spaces"
@Echo %ErrorLevel% & Pause