Как вернуть значение из одного пакетного файла в пакетный файл вызывающего абонента
У меня есть общее .файл 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"
)