批处理 - 如何从批处理文件返回值?

Cha*_*les 6 return function batch-file

我知道如何从同一个批处理文件中的函数返回一个值,但是我发现从另一个批处理文件返回一个值时出现了一些问题.这是一个例子:

文件 1.cmd

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

set number=1
call 2.cmd

echo. %number%

ENDLOCAL
exit /B
Run Code Online (Sandbox Code Playgroud)

文件 2.cmd

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

ENDLOCAL & set number=2
exit /B
Run Code Online (Sandbox Code Playgroud)

输出仍然是1.有没有解决方案?

dbe*_*ham 7

LittleBobbyTables走在了正确的轨道上.

您使用两个SETLOCAL但只使用1个ENDLOCAL会导致设置变量,但随后定义将丢失,因为当批处理退出EXIT/B时会有一个额外的隐式ENDLOCAL.只要批处理或函数终止,所有SETLOCAL都将结束.在设置值之前,您的代码只需要一个额外的ENDLOCAL.

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

ENDLOCAL & ENDLOCAL & set number=2
exit /B
Run Code Online (Sandbox Code Playgroud)

但是极少需要启用enableExtensions,因为默认情况下始终启用扩展.您应该能够删除SETLOCAL ENABLEEXTENSIONS并使用单个ENDLOCAL.

如果由于某种原因您确实需要启用扩展,那么您可以在单个SETLOCAL上使用这两个选项,但仍然只需要一个ENDLOCAL

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

ENDLOCAL & set number=2
exit /b
Run Code Online (Sandbox Code Playgroud)


Lit*_*les 2

我很难正确地解释它,但是两者的结合

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
Run Code Online (Sandbox Code Playgroud)

您的文件中的2.cmd内容导致变量评估的延迟。

如果其中一个单独启用,则%number%仍应设置为 2,但一起启用时,%number%将设置为 1。