Batch file 如何将值从一个批处理文件返回给调用方批处理文件
我有一个公共的.bat文件,它读取status.xml文件并找出status字段的值。然后,其他批处理文件调用该批处理文件,以查找状态值。调用批处理文件将文件名发送到公共bat文件。 我无法将状态从公用批处理文件发送到调用批处理文件。 有人能帮忙吗Batch file 如何将值从一个批处理文件返回给调用方批处理文件,batch-file,command-line-arguments,Batch File,Command Line Arguments,我有一个公共的.bat文件,它读取status.xml文件并找出status字段的值。然后,其他批处理文件调用该批处理文件,以查找状态值。调用批处理文件将文件名发送到公共bat文件。 我无法将状态从公用批处理文件发送到调用批处理文件。 有人能帮忙吗 main batch file -- will call the common bat file and send the file name and a variable as arguments setlocal call Common.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
)
))
主批处理文件
--将调用公共bat文件,并将文件名和变量作为参数发送
setlocal
调用Common.bat c:\folderdir\files\status.xml val1
--正在尝试打印公共bat文件返回的状态
回声[%1%]
公共批处理文件
@回音
setlocal EnableDelayedExpansion
rem将遍历文件并读取状态标记的值
(对于/F“delims=“%a in(%1)do(
设置“行=%%a”
设置“换行符=!行:=!”
设置“换行符=!换行符:=!”
如果“!换行!”neq“!换行!”(
@回显状态为!换行!
rem我想向调用批处理文件发送'enter code here'换行符的值
set%~2=!newLine!在SETLOCAL/ENDLOCAL括号内(其中EOF=ENDLOCAL),对环境所做的任何更改都将被备份
您需要在Common.bat
中设置一个变量,该变量在最后一个右括号(即返回值)后可见,并且可以是空字符串
然后,在common.bat
的最后一个右括号后的一行中,放入以下内容:
ENDLOCAL&set %~2=%returnvalue%
其中returnvalue
包含您希望返回的er值(有趣的是…)
顺便说一句:字符串SET
是空间敏感的。如果行起作用,您将设置变量“VAR1”
-而不是“VAR1”
-变量名中包含=
前面的空格,而=
后面的空格也会包含在指定的值中
语法
set "var=value"
通常用于排除行上的任何多余尾随空格(某些编辑器可能会留下)
(叹气)
@ECHO关闭
setlocal EnableDelayedExpansion
rem将遍历文件并读取状态标记的值
(对于/F“delims=“%a in(%1)do(
设置“行=%%a”
设置“换行符=!行:=!”
设置“换行符=!换行符:=!”
如果“!换行!”neq“!换行!”(
@回显状态为!换行!
rem设置返回值
设置RETURNVALUE=!换行符!
)
))
ENDLOCAL&设置%%2=%RETURNVALUE%
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!中包含的返回值设置为任何其他变量。因此我无法将新行设置为returnvalue并在块后使用它。谢谢!我在for循环后有几行代码由于某种原因没有执行,这就是为什么没有设置返回值。Fo告诉我ENDLOCAL和&必须像ENDLOCAL&set returnvalue=%returnvalue%
那样分开,re:--我不知道这是否是这里给出的答案中的错误。@AlexHall:至少在理论上,不需要额外的空格。我从来没有遇到过需要使用它们的情况。也许如果你能稍微扩展一下你的答案观察结果是,我们都可能会有所收获。我不确定是什么原因导致ENDLOCAL&
对我不起作用和ENDLOCAL&
起作用。发生这种情况的脚本是从控制台运行的;%returnvalue%
之前通过SET returnvalue=thistring
命令分配的。当我从新控制台运行脚本,ENDLOCAL&set returnvalue=%returnvalue%
不会导致%returnvalue%具有任何值分配(换句话说,它不存在)在控制台中;然而ENDLOCAL&set returnvalue=%returnvalue%
最终得到了一个值分配。同样,这是在Windows 7上。我能够将common.bat中的值传递到main.bat。不过我有一个问题。如果应用程序调用main.bat,那么它是否能够从main.bat中检索该值?您的应用程序ikation也是一个批处理文件?然后这就是Peter和我展示的方式。否则你可以尝试回显结果,然后应用程序过滤stdin流
@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%"
)
for /F "delims=" %%a in ("!newline!") DO (
endlocal
set "%~2=%%~a"
)