如何将一个批处理文件中的值返回给调用者批处理文件
Posted
技术标签:
【中文标题】如何将一个批处理文件中的值返回给调用者批处理文件【英文标题】:How to return value from one batch file to caller batch file 【发布时间】:2013-07-19 00:00:14 【问题描述】:我有一个通用的 .bat 文件,它读取 status.xml 文件并找出状态字段的值。这个批处理文件然后被其他批处理文件调用以找出状态值。调用批处理文件将文件名发送到公共 bat 文件。 我无法将公共批处理文件中的状态发送到调用批处理文件。 有人可以帮忙吗?
main batch file
-- will call the common bat file and send the file name and a variable as arguments
setlocal
call Common.bat c:\folderdir\files\status.xml val1
-- trying to print the status returned by the common bat file
echo [%val1%]
common batch file
@ECHO off
setlocal EnableDelayedExpansion
rem will loop through the file and read the value of the status tag
(for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
@echo Status is !newLine!
rem I want to send`enter code here` the value of newLine to the calling batch file
set %~2 = !newLine! <--this does not work
)
))
【问题讨论】:
【参考方案1】:在 SETLOCAL/ENDLOCAL 括号内(EOF=ENDLOCAL)对环境所做的任何更改都会被撤销。
您需要在Common.bat
中设置一个变量,该变量在最后的右括号之后可见(即您的返回值 - 它可能是一个空字符串。
然后,在common.bat
的最后一个右括号之后的行中,放入以下行:
ENDLOCAL&set %~2=%returnvalue%
returnvalue
包含您希望返回的 er 值(有趣的是...)
顺便说一句:字符串SET
是空间敏感的。如果该行有效,您将设置变量 "VAR1 "
- 而不是 "VAR1"
- =
之前的空格将包含在变量名称中 - 并且 =
之后的任何空格同样包含在值中已分配。
语法
set "var=value"
通常用于排除一行中的任何杂散尾随空格(某些编辑器可能会留下)
(叹气)...
@ECHO off
setlocal EnableDelayedExpansion
rem will loop through the file and read the value of the status tag
(for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
@echo Status is !newLine!
rem SET THE RETURN VALUE
set RETURNVALUE=!newLine!
)
))
ENDLOCAL&SET %~2=%RETURNVALUE%
【讨论】:
感谢您的信息!问题是我无法设置包含在 !newLine! 中的返回值!到任何其他变量。所以我不能将换行符设置为返回值并在块之后使用它 谢谢!在 for 循环之后我有几行代码由于某种原因没有被执行,这就是为什么没有设置返回值。 对我来说,ENDLOCAL 和 & 必须像ENDLOCAL & set returnvalue=%returnvalue%
一样拆分,回复:ss64.org/viewtopic.php?pid=4940#p4940 -- 我不知道这是否是这里给定答案的错字。
@AlexHall :至少在理论上,不需要额外的空格。我从未遇到过我需要使用它们的情况。或许,如果您要稍微扩展您的观察结果,我们都可能会倾向于一些东西。
我不确定ENDLOCAL&
不适合我和ENDLOCAL &
工作的不同之处。发生这种情况的脚本是从控制台运行的; %returnvalue%
之前通过例如分配SET returnvalue=thisString
命令。当我从新控制台运行脚本时,ENDLOCAL& set returnvalue=%returnvalue%
不会导致 %returnvalue% 在控制台中有任何赋值(换句话说,它不存在);而ENDLOCAL & set returnvalue=%returnvalue%
确实得到了赋值。此外,这是在 Windows 7 上。【参考方案2】:
Peter Wright 描述了主要技术。
最后一个问题似乎是在不丢失值的情况下退出for循环。
您可以使用GOTO :break
作为GOTO
立即停止所有循环。
不能在ENDLOCAL
块中使用!newline!
,因为它会在ENDLOCAL
之后扩展,但它是空的。
@ECHO off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
@echo Status is !newLine!
goto :break
)
)
(
endlocal
set "%~2=%newLine%"
)
如果你在 newLine 中的值可能包含引号,那么最好使用一种更安全的技术:
for /F "delims=" %%a in ("!newline!") DO (
endlocal
set "%~2=%%~a"
)
【讨论】:
我能够将值从 common.bat 传递到 main.bat。但我有个问题。如果应用程序调用 main.bat,那么它是否能够从 main.bat 中检索值? 您的应用程序也是批处理文件吗?然后就是彼得和我展示的方式。否则,您可以尝试回显结果,然后应用程序过滤标准输入流以上是关于如何将一个批处理文件中的值返回给调用者批处理文件的主要内容,如果未能解决你的问题,请参考以下文章