2016-04-27 2 views
0

Ich habe ein Problem mit dem Exit-Status eines untergeordneten Skripts, das zurück zum übergeordneten Skript geht (Kind, das von einer for-Schleife aufgerufen wird).Probleme in einer Stapeldatei, die von einer for-Schleife aufgerufen wird

Syntax der Mutter Skript:

for /f "usebackq" %%i in (`dir/b /o:d %partionHome%\tmp\queue\*.t~#`) do call "%partionHome%\conf\SQLLoader\SQL_Loader_%DSNname% 
\SQLLoader_UA_SYSTEM_TABLES.bat" %1 %2 %3 %4 %5 %6 %7 "%%i" %has_prefix% "%partionHome%" 
echo ERRORLEVEL_Master %ERRORLEVEL%             >> %logfile% 
if %ERRORLEVEL% NEQ 0 goto :failed 
goto :end 
:end 
echo Executed loop >> %logfile% 
echo got out >> %logfile% 
echo Success >> %logfile% 
exit 0 
:failed 
echo Load Failed >> %logfile% 
exit 1 

DAS KIND SCRIPT:

"%sqlbinn%\sqlcmd.exe" -S %dbHost% -d %databaseName% -U %userName% -P %pwd% -Q "BULK INSERT %databaseName%.dbo.%tableName% FROM '%bulkloader%\%DATA_FILE%' WITH (FIELDTERMINATOR = '|', ROWTERMINATOR = '\n', 
FORMATFILE='%bulkloader%\%CTRL_FILE%')" >> %logfile% 2>&1 
echo ERRORLEVEL %ERRORLEVEL%            >> %logfile% 
if %ERRORLEVEL% NEQ 0 goto :errors 
goto :doneld 
:doneld 
echo i am here3 >> %logfile% 
echo * Delete the control and data file from the shared directory   >> %logfile% 
del %confdirectory%\%DATA_FILE% 
del %confdirectory%\%CTRL_FILE% 
set H=%time:~-10,1% 
if %time:~-11,2% LSS 10 (set Hour=%time:~-10,1%) else (setHour=%time:~-11,2%) 
set M=%time:~-8,2% 
set s=%time:~-5,2% 
echo ** SQLLoad ENDS %H%:%M%:%s%           >> %logfile% 
echo i am here4 >> %logfile% 
EXIT /B 0 
:errors 
echo i am here5 >> %logfile% 
echo *                  >> %logfile% 
echo WARNING! Error(s) were detected in the SQL loader utility!    >> %logfile% 
echo Please check the data file, control file or the SQL loader utility  >> %logfile% 
echo *                  >> %logfile% 
echo sqlloaderERROR check log file %logfile% >> %logDirectory%\sqlloaderlogs\LOAD_ERROR_DETECTED_%Day%-%Mth%-%Yr%_%Hour%_%Min%_%sec%_%msec% 
time /t >> %logfile% 
EXIT /B 1 

Der SQL-Befehl funktioniert und die Daten hochgeladen, die Protokolldatensätze, die es alles tut es sollte, und gibt „Echo Ich bin here4 ", aber aus irgendeinem Grund wiederholt sich der Prozess für etwa 22 mal (sqlcmd.exe) und dann korrekt beenden (echo ausgeführte Schleife, Echo Success usw. aus dem Master-Skript) ?????

Ich dachte, das EXIT/B * sollte einen Fehlercode an das Hauptskript zurückgeben, damit es ausgewertet wird (was ich habe), aber es nicht und nur Schleifen und versucht, sqlcmd.exe immer und immer wieder auszuführen Erfolg und Schluss?

Antwort

0

Die exit /b 1 hält Ihr Kind Skript und stellen Sie den Errorlevel auf 1

Warum es alles andere aufhören sollte?
Es stoppt weder das übergeordnete Skript noch die Schleife.
exit /b funktioniert ein bisschen wie return in anderen Sprachen.

Sie können in der Schleife den Errorlevel testen und dann die Schleife stoppen (mit einem goto :label).

Wie

for /f %%i in (`dir/b queue\*.t`) do (
    call child 
    if errorlevel 1 goto :break 
) 
:break 
+0

sorry, ziemlich neu in diesem, ich verstehe es muss irgendwie die for-Schleife brechen. Ich nehme an, Sie können Folgendes für/f "usebackq" %% i in ('dir/b/o: d% partitionHome% \ tmp \ queue \ *. T ~ #') verwenden, rufen Sie "% partitionHome% \ conf \ SQLLoader \ SQL_Loader_% DSNname% \ SQLLoader_UA_SYSTEM_TABLES.bat "% 1% 2% 3% 4% 5% 6% 7" %% i "% has_prefix%"% partitionHome% "(wenn Fehlerlevel 1: Fehler bei Fehlerlevel 0 goto: end ) –

+0

Sie müssen den vollständigen Codeblock in Klammern einschließen, nicht nur das '(wenn errorlevel ....' auch das 'call"% partition .... ' – jeb

+0

ok, reran so: für/f "usebackq" %% i in ('dir/b/o: d% partitionHome% \ tmp \ queue \ *. t ~ #') (rufen Sie "% partitionHome% \ conf \ SQLLoader \ SQL_Loader_% DSNname% auf \ SQLLoader_UA_SYSTEM_TABLES.bat "% 1% 2% 3% 4% 5% 6% 7" %% i "% has_prefix%"% partitionHome% "wenn Fehlerlevel 1: Fehler, wenn Fehlerlevel 0: ) –

Verwandte Themen