2012-07-14 11 views
18

Szukam sposobu używania pliku wsadowego okna, który wywołuje plik wsadowy, który przekazuje parametry 1-9 i wartość zwracaną (ciąg) bez potrzeby zapisania wartości zwracanej do pliku/etc. Wartością zwracaną zapisać do zmiennej jak uczynił w @FOR/FPlik wsadowy wywołania pliku wsadowego do przekazywania n paramentów i zwracania bez użycia pliku

patrzę na

@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i 

i

Call function/batch %arg1% %arg2% 

nie widzę w jaki sposób mogę to zrobić setup

EDIT: dbenham nieco odpowiedzieć na moje pytanie. Jego przykład znajdował się między główną partią pliku a funkcją. Moje pytanie dotyczyło dwóch różnych plików wsadowych. Bazuj na dbenham, odpowiedz, że jest to układ podążania.

Główny plik wsadowy

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 
+0

W jaki sposób partia odpowiada wartości? Na ekranie? Czy jest to miejsce, w którym utknąłeś? –

+0

Teraz mam zwrotne echo zmiennej, ponieważ "@FOR/F" przechwytuje echo i zapisuje do zmiennej. Krótko mówiąc, chcę, aby funkcja powrotu do zmiennej zapisała się w zmiennej, podczas gdy w tym samym czasie będzie mogła przejść od 1 do 9 parametrów. – TheMadCat

Odpowiedz

32

ogólnie funkcje partii zwracania wartości w jednym z dwóch sposobów:

1) jedna wartość całkowita może być wydalane do errorlevel stosując EXIT /B n gdzie n = pewnej liczby.

@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) sposób, mówiąc bardziej elastyczne w użyciu zmienne środowiska powrotu jednego lub więcej wartości

@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 

Nazwa zmiennej, jeśli odpowiedź jest do przechowywania mogą być przekazywane jako parametr ! Wartości pośrednie można ukryć przed głównym programem.

@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 

Dla kompletnego wyjaśnienia jak ostatni przykład działa, przeczytaj ten doskonały batch function tutorial w DOStips.

Aktualizacja

Powyższy wciąż ma ograniczeń co do treści, które mogą być zwrócone. Zobacz https://stackoverflow.com/a/8254331/1012053 dla alternatywnej metody opartej na FOR, która obsługuje szerszy zakres wartości.Zobacz też https://stackoverflow.com/a/8257951/1012053 dla "magicznej" techniki, która może bezpiecznie zwrócić absolutnie dowolną wartość o długości < ~ 8190, pod dowolnymi warunkami.

+0

dbenham, dziękuję – TheMadCat

0

Brakuje paru rzeczy:

  • użycie nie backticks apostrofów.
  • dodać usebackq wewnątrz podwójnego cudzysłowu za pomocą polecenia tokeny.

Ten znak `nie ten charakter"

na amerykańskiej klawiaturze angielskiej The grawis jest przesunięcie tylda, który jest zazwyczaj po lewej stronie 1 w liczbie rzędu.

@FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i
+3

Pojedyncze cudzysłowy (apostrofy) też są w porządku, jeśli nie ma ich w 'find_OS_version'. Nie ma specjalnej potrzeby, aby używać cudzysłowów i 'usebackq'. Ta odpowiedź nie rozwiązuje również problemu PO. –

+2

Lokalizacja akcentu grave jest również błędna; tylda potrzebuje zmiany, a nie grób. – Joey

+0

Widzę, jak przekazać parametry do pliku wsadowego za pomocą @FOR/F "usebackq tokens = *"? – TheMadCat

3

Mały TIP

Setlocal EnableDelayedExpansion 
IF 1==1 (
    CALL :LABEL 
    echo 1: %errorlevel% 
    echo 2: !errorlevel! 
) 
echo 3: %errorlevel% 

:LABEL 
EXIT /B 5 

wyjściowe będą:

1: 0 
2: 5 
3: 5 

EnableDelayedExpansion pozwala na użycie var_name! aby rozwinąć var ​​w czasie wykonywania, zamiast analizować czas.

+0

bardzo przydatna wskazówka, należy wznowić! – DarkSide

Powiązane problemy