2012-07-14 87 views
18

我正在尋找一種方式使用windows批處理文件調用子批處理文件,通過1-9參數和返回值(字符串)將返回值保存到文件/ etc中。返回值我保存到變量像@FOR所做/ F批處理文件調用子批處理文件傳遞n個參數,並返回不使用文件

我看

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

Call function/batch %arg1% %arg2% 

我沒有看到我怎麼可以設置要做到這一點

編輯: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 
+0

子批次如何返回其值?屏幕上?或者它卡在哪裏? – 2012-07-14 09:05:02

+0

現在我有返回變量回聲,因爲「@FOR/F」捕獲回聲並保存到變量中。所以簡而言之,我希望將返回保存到變量中,同時能夠傳遞1到9個參數。 – TheMadCat 2012-07-14 18:01:01

回答

32

通常批次功能在兩種方式之一返回值。

@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上的優秀batch function tutorial

更新

上面仍舊是有限制爲可返回該內容。有關基於FOR的替代方法,請參閱https://stackoverflow.com/a/8254331/1012053,該方法支持更寬範圍的值。在任何情況下,參見https://stackoverflow.com/a/8257951/1012053「神奇」技術可以安全地返回任何長度爲<〜8190的值。

+0

dbenham,謝謝 – TheMadCat 2012-07-18 12:52:23

0

你錯過了兩件事情:

  • 使用反引號不是單引號。
  • 使用tokens命令在雙引號內添加usebackq。

這個字符`不是這個字符'

在一個美國英語鍵盤,倒引號是移位波浪線,這通常是對1的數量行中的左側。

1)一種單個整數值可以通過錯誤級別通過使用EXIT /B n其中n =一些號碼被返回:

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

單引號(撇號)也可以,如果'find_OS_version'中沒有任何內容。沒有特別的需要使用反引號和'usebackq'。另外,這個答案並不能解決OP的問題。 – 2012-07-14 09:01:31

+2

嚴重口音的位置也是錯誤的;代字符需要轉移,嚴重不。 – Joey 2012-07-14 09:04:58

+0

我看到了,如何使用@FOR/F「usebackq tokens = *」將參數傳遞給子批處理文件? – TheMadCat 2012-07-14 18:03:51

3

TIP

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,而不是解析時間。

+0

非常有用的提示,應該是upvoted! – DarkSide 2014-12-01 12:23:32

相關問題