Возвращение строки из пакета внешних функций - PullRequest
0 голосов
/ 12 мая 2018

У меня есть два пакетных файла. Один - это основной (вызывающий) файл, а другой - функция. Функция принимает один параметр, делает некоторые вещи, а затем я хочу вернуть строку вызывающей стороне (main.bat). % ERRORLEVEL% не является опцией, так как он может возвращать только целые числа.

main.bat:
call function.bat hello
function.bat:
REM some code.......
[ЗДЕСЬ КОД, ЧТОБЫ ВЕРНУТЬ СТРОКУ ДЛЯ ФАЙЛА ВЫЗОВА]
Похоже на базовую операцию, поэтому должен быть способ. Кроме того, я предпочитаю не создавать файлы с выводом и читать их в main.bat, потому что я хочу, чтобы они работали как простая в использовании функция.

1 Ответ

0 голосов
/ 12 мая 2018

Два пакетных файла выполняются одним и тем же процессом командного процессора Windows и поэтому совместно используют все переменные среды.

Main.bat:

@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=%MyVariable%

Function.bat:

@echo off
rem Some code ...
set "MyVariable=%~1"

Возможно, Function.bat почему-то использует команду SETLOCAL . В этом случае все определенные переменные среды, а также все изменения, внесенные в переменные среды после команды SETLOCAL , теряются после соответствующей ENDLOCAL . Эта команда неявно вызывается командным процессором Windows при выходе из выполнения командного файла для каждого SETLOCAL , еще не завершенного с явным выполнением соответствующего ENDLOCAL . Прочитайте этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .

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

Function.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=%~1"
endlocal & set "MyVariable=%MyVariable%"

Последняя командная строка сначала обрабатывается интерпретатором команд Windows до

endlocal   & set "MyVariable=hello"

Таким образом, командная строка после предварительной обработки больше не содержит ссылки на переменную. Команда ENDLOCAL восстанавливает предыдущую среду, что приводит к удалению переменной среды MyVariable. Но вторая команда SET , указанная в той же командной строке, снова устанавливает эту переменную со значением hello в восстановленной среде.

См. Также Одна строка с несколькими командами с использованием пакетного файла Windows .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...