Подтвердить что ты не робот

Пакетный файл вызова пакетного файла для передачи 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
4b9b3361

Ответ 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