从调用的批处理文件中接收变量
Receive variable from a called batch file
我这里有两个批处理文件,test.bat
和 len.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
我这里有两个批处理文件,test.bat
和 len.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