Batch file 如何将值从一个批处理文件返回给调用方批处理文件

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

我有一个公共的.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 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" 
)