Как вернуть значение из одного пакетного файла в пакетный файл вызывающего абонента

У меня есть общее .файл bat, который считывает статус.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:folderdirfilesstatus.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
)

)) 

2 ответов


в скобке SETLOCAL/ENDLOCAL (где EOF=ENDLOCAL) любые изменения, внесенные в среду, резервируются.

вам нужно установить переменную внутри Common.bat это видно после заключительной круглой скобки (т. е. ваше возвращаемое значение - и это может быть пустая строка.

затем в строке после common.batзаключительная скобка, поставьте эту строку:

ENDLOCAL&set %~2=%returnvalue%

здесь returnvalue содержит значение er, которое вы хотите вернуть (смешно, что...)

BTW: строка 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%

Питер Райт описывает основную технику.

последней проблемой, по-видимому, является выход из цикла for без потери значения.

можно использовать GOTO :break as GOTO немедленно останавливает все петли.

невозможно использовать !newline! на ENDLOCAL блок, так как это расширит после 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%"
)

если ваше значение в новой строке может содержать кавычки, то лучше использовать технику, которая немного безопаснее:

for /F "delims=" %%a in ("!newline!") DO (
  endlocal
  set "%~2=%%~a" 
)