Пакетный файл вызова пакетного файла для передачи n паразитов и возврата без использования файла
Я ищу способ использования оконного пакетного файла, вызывающего суб-пакетный файл, который передает параметры 1-9 и возвращаемое значение (строка) без необходимости сохранения возвращаемого значения в файл /etc. Возвращаемое значение, которое я сохраняю в переменной, как в @FOR/F
Я смотрю
@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i
и
Call function/batch %arg1% %arg2%
Я не вижу, как я могу настроить это
EDIT: dbenham несколько отвечает на мой вопрос. Его пример был между основной частью пакета и функцией. Мой вопрос заключался в двух разных командных файлах. Основываясь на dbenham, ответьте на этот макет.
Основной пакетный файл
CALL sub_batch_file.bat return_here "Second parameter input"
REM echo is Second parameter input
ECHO %return_here%
REM End of main-batch file
sub_batch_file.bat
@ECHO OFF
SETLOCAL
REM ~ removes the " "
SET input=%~2
(
ENDLOCAL
SET %1=%input%
)
exit /b
REM End of sub-batch file
Ответы
Ответ 1
Обычно функции пакетной обработки возвращают значения одним из двух способов:
1) Одно целое значение может быть возвращено через уровень ошибок с помощью EXIT /B n
, где n = некоторое число.
@echo off
setlocal
call :sum 1 2
echo the answer is %errorlevel%
exit /b
:sum
setlocal
set /a "rtn=%1 + %2"
exit /b %rtn%
2) Более гибким методом является использование переменных среды для возврата одного или нескольких значений
@echo off
setlocal
call :test 1 2
echo The sum %sum% is %type%
call :test 1 3
echo The sum %sum% is %type%
exit /b
:test
set /a "sum=%1 + %2, type=sum %% 2"
if %type%==0 (set "type=even") else (set "type=odd")
exit /b
Имя переменной, в которой должен храниться ответ, может быть передано как параметр! И промежуточные значения могут быть скрыты от основной программы.
@echo off
setlocal
call :test 1 2 sum1 type1
call :test 1 3 sum2 type2
echo 1st sum %sum1% is %type1%
echo 2nd sum %sum2% is %type2%
exit /b
:test
setlocal
set /a "sum=%1 + %2, type=sum %% 2"
if %type%==0 (set "type=even") else (set "type=odd")
( endlocal
set "%3=%sum%"
set "%4=%type%"
)
exit /b
Для полного объяснения того, как работает последний пример, прочитайте этот отличный учебник по пакетной функции в DOStips.
Обновление
Вышеизложенное имеет ограничения в отношении содержимого, которое может быть возвращено. См. fooobar.com/questions/150365/... альтернативный метод, основанный на FOR, который поддерживает более широкий диапазон значений. И посмотрите fooobar.com/questions/150365/... на "магическую" технику, которая может безопасно вернуть абсолютно любое значение с длиной < ~ 8190, при любых обстоятельствах.
Ответ 2
Малый СОВЕТ
Setlocal EnableDelayedExpansion
IF 1==1 (
CALL :LABEL
echo 1: %errorlevel%
echo 2: !errorlevel!
)
echo 3: %errorlevel%
:LABEL
EXIT /B 5
Выход будет:
1: 0
2: 5
3: 5
EnableDelayedExpansion позволяет использовать! var_name! для расширения var во время выполнения, а не для разбора времени.
Ответ 3
Вам не хватает пары вещей:
- Использовать обратные ссылки не одинарные кавычки.
- добавьте usebackq внутри двойных кавычек с помощью команды tokens.
Этот символ `не этот символ '
На английской английской клавиатуре обратная сторона имеет shift-тильду, которая обычно находится слева от 1 в числовой строке.
@FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i