从外部函数批处理返回字符串



我有两个批处理文件。一个是主(调用方(文件,一个是函数。 该函数接受一个参数,做一些事情,然后我想将字符串返回给调用者(main.bat(。%ERRORLEVEL% 不是一个选项,因为它只能返回整数。

main.bat:
call function.bat hello
函数.bat:
REM some code.......
[这里是将字符串返回给调用方文件的代码]似乎
是一个基本操作,所以一定有办法。另外,我不喜欢使用输出制作文件并在main.bat中读取它,因为我想让它作为一个易于使用的功能工作。

这两个批处理文件由同一个 Windows 命令处理器进程执行,因此共享所有环境变量。

主.bat:

@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=%MyVariable%

功能.bat:

@echo off
rem Some code ...
set "MyVariable=%~1"

可能是Function.bat出于某种原因使用命令SETLOCAL。在这种情况下,所有定义的环境变量以及在命令SETLOCAL之后对环境变量所做的所有修改都将在相应的ENDLOCAL之后丢失。Windows 命令处理器在退出执行每个尚未完成的批处理文件并显式执行相应ENDLOCAL时隐式调用此命令。阅读此答案,了解有关命令SETLOCALENDLOCAL的详细信息。

有必要在与命令ENDLOCAL相同的命令行上显式设置环境变量,并使用即时环境变量扩展将环境变量的值从当前环境变量列表传递到以前的环境变量列表。

功能.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=%~1"
endlocal & set "MyVariable=%MyVariable%"

最后一个命令行首先由 Windows 命令解释器预处理为

endlocal   & set "MyVariable=hello"

因此,预处理后的命令行不再包含任何变量引用。命令ENDLOCAL恢复以前的环境,从而导致删除环境变量MyVariable。但是在同一命令行上指定的第二个命令SET再次使用还原环境中的值hello设置此变量。

另请参阅使用 Windows 批处理文件的包含多个命令的单行。

最新更新