2013-04-23 47 views
1

我有一個批處理腳本「first.bat」,它返回值列表和退出代碼。我的任務是在另一個腳本「second.bat」中調用此腳本,並且僅當第一個腳本的調用沒有返回錯誤代碼時,纔對「first.bat」返回的值執行操作。在另一個批處理腳本中調用一個批處理腳本,並對第一個腳本返回的值執行操作

我已經調用first.bat並將其輸出存儲在文本文件中。之後,我檢查結果代碼,如果結果代碼是成功代碼,則通過讀取文本文件來執行操作。而且手術後我刪除文本文件

下面是second.bat的代碼片段

@ECHO OFF 


call first.bat >t 

if /i %errorlevel%==100 (

echo Performing operation 

for /F "tokens=1" %%a in (t) do echo %%a 

for /F "tokens=2" %%a in (t) do echo %%a 

del t 

) else (
    echo Error occurred 
) 

我想知道能不能同樣的事情在一些優雅的方式通過不寫第一的輸出來完成.bat文本文件。

+0

您可以爲保留值設置一些環境變量。我沒有看到很多選擇。 – 2013-04-23 10:36:15

回答

1
@ECHO OFF 
SETLOCAL 
for %%i in (var return1 return2 bat1err) do set "%%i=" 
FOR /f %%i IN ('call first') DO SET var=%%i 
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j 

應該建立RETURN1和RETURN2你的兩個值,而是由FIRST.bat產生的ERRORLEVEL價值不能被檢索。

在您的原始代碼中,文件t將在任何情況下生成 - 並且如果first.bat沒有輸出將爲零。我很困惑你的行動只刪除t如果沒有錯誤發生....

所以 - 我們真的需要做的是改變FIRST.bat一點。

如果first.bat不使用SETLOCAL,然後

set bat1err=%errorlevel% 

在適當的點會bat1err集返回錯誤級別。

如果first.bat確實使用SETLOCAL,那麼生活變得在適當的點會設置bat1err以同樣的方式有點複雜,

set bat1err=%errorlevel% 

,但你需要使用

ENDLOCAL&set bat1err=%bat1err% 

退出前。這是一個解析技巧,可以先解析該行,然後執行。什麼情況是,該行作爲

endlocal&set bat1err=22 

或任何實際執行,調用,而不是所謂的間歇的範圍內設定BAT1ERR

另一種方法是,包括%errorlevel%在你的輸出,並簡單分析改爲

FOR /f "tokens=1,2,3" %%i IN ("%var%") DO set bat1err=%%i&return1=%%j&set return2=%%k 

,或者根據相當的first.bat輸出,你可以做到這一點第三種方式是什麼:

如果first.bat不產生任何輸出錯誤,但成功輸出的線,

FOR /f %%i IN ('call first') DO SET var=%%i 
if defined var (
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j 
) else (echo Error occurred) 

,並再次可以用IF DEFINED分析,return2var作出決定。

這真的取決於我們沒有的信息。

+0

感謝您使用'ENDLOCAL&set bat1err =%bat1err%'技巧。 – 2014-04-29 00:23:31

相關問題