【问题标题】: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
)

)) 

【问题讨论】:

    标签: batch-file command-line-arguments


    【解决方案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 &amp; set returnvalue=%returnvalue% 一样拆分,回复:ss64.org/viewtopic.php?pid=4940#p4940 -- 我不知道这是否是这里给定答案的错字。
    • @AlexHall :至少在理论上,不需要额外的空格。我从未遇到过我需要使用它们的情况。或许,如果您要稍微扩展您的观察结果,我们都可能会倾向于一些东西。
    • 我不确定ENDLOCAL&amp; 不适合我和ENDLOCAL &amp; 工作的不同之处。发生这种情况的脚本是从控制台运行的; %returnvalue% 之前通过例如分配SET returnvalue=thisString 命令。当我从新控制台运行脚本时,ENDLOCAL&amp; set returnvalue=%returnvalue% 不会导致 %returnvalue% 在控制台中有任何赋值(换句话说,它不存在);而ENDLOCAL &amp; 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 中检索值?
    • 您的应用程序也是批处理文件吗?然后就是彼得和我展示的方式。否则,您可以尝试回显结果,然后应用程序过滤标准输入流
    猜你喜欢
    • 2011-10-07
    • 2012-11-17
    • 1970-01-01
    • 2012-07-13
    • 2012-07-17
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多