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

5 windows function batch-file

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

main.bat:
call function.bat hello
function.bat:
REM some code.......
[HERE THE THE CODE TO RETURN A STRING TO CALLER FILE]
好像是基本操作,所以一定有办法。另外,我不喜欢用输出制作文件并在 main.bat 中读取它,因为我想让它作为一个易于使用的功能工作。

Mof*_*ofi 5

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

主.bat:

@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=%MyVariable%
Run Code Online (Sandbox Code Playgroud)

功能.bat:

@echo off
rem Some code ...
set "MyVariable=%~1"
Run Code Online (Sandbox Code Playgroud)

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

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

功能.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=%~1"
endlocal & set "MyVariable=%MyVariable%"
Run Code Online (Sandbox Code Playgroud)

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

endlocal   & set "MyVariable=hello"
Run Code Online (Sandbox Code Playgroud)

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

另请参阅使用 Windows 批处理文件的带有多个命令的单行