mario.steinberg
Goto Top

Zusammengesetzte Umgebungsvariable im Batchfile

Hallo,

ich hoffe ihr verzeiht mir die Kurzausführung meiner Problembeschreibung.
Nachdem ich gerade einige Zeit investiert habe um mein Problem schön zu beschreiben, dann aber den Text durch den Zwangslogout nach gefühlt 5Min verloren habe, fehlen mir nun die Kapazitäten alles noch einmal von vorne zu machen. Deshalb die Kurzversion

Folgend mein zusammengekürztes Codebeispiel:

@echo off 
setlocal enabledelayedexpansion

for /f "delims=" %%i in ('dir /a:-d /b *.SQL') do (	  
	set /a counter=1
	for /f "delims=:" %%j in ('findstr /n /c:"CREATE TABLE" %%i') do (  
		set %%i_ZeileAb[!counter!]=%%j 
		set /a counter=!counter! + 1
	)
	
	set /a counter=1
	for /f "delims=: tokens=1,2" %%l in ('findstr /n "^" %%i') do (  
		echo if %%l gtr !%%i_ZeileAb[!!counter!!]! 
	)
)

pause  

Ich durchsuche verschieden .sql-Dateien nach dem String CREATE TABLE (mehrfach pro Datei vorhanden) und speichere die entsprechende Zeilennummer in einer zusammengesezten Umgebungsvariable ab (Teil 1 der Beispiels). Dies funktiert auch sehr gut. Ein SET create zeigt mir die entsprechendne Zeilennummern:

create.SQL_ZeileAb[1]=11
create.SQL_ZeileAb[2]=21
create2.SQL_ZeileAb[1]=4
create2.SQL_ZeileAb[2]=14

Leider bekomme beim Abfragen des Variableninhalts (echo !%%i_ZeileAb[!!counter!!]! ) immer nur den Wert 1 zurück.
Weiß vielleicht jemand wo meine Problem liegt. Ein ähnliches Problem hatte ich bereits beiläufig in meinem Post am Montag beschreiben, doch leider konnte mir wohl niemand weiterhelfen.

Schon mal Danke für eure Mühen und schöen Grüße,
Mario

Content-ID: 156101

Url: https://administrator.de/contentid/156101

Ausgedruckt am: 19.11.2024 um 20:11 Uhr

Mario.Steinberg
Mario.Steinberg 01.12.2010 um 09:27:19 Uhr
Goto Top
Hallo,

ich habe noch etwas geforscht. Mein Problem ist offensichtlich das setlocal enabledelayedexpansion , welches ich an der Stelle, an der ich das echo if %%l gtr !%%i_ZeileAb[!!counter!!]! aufrufe nicht gebrauchen kann.


Ich habe mal versucht mittles:

echo !%%h_ZeileAb_1!
echo !create2_ZeileAb_1!

auf die Variablen zuzugreifen. Beides hat funktioniert nur der Zugriff via

set /a counter=1
echo !%%h_ZeileAb_!counter!!
echo !%%h_ZeileAb_!!counter!!!

nicht!

Gibt es eine Alternative?
Mario.Steinberg
Mario.Steinberg 01.12.2010 um 13:21:18 Uhr
Goto Top
So geschafft!

@echo off 
setlocal enabledelayedexpansion

set ORDNERNAME=Result
if not exist %ORDNERNAME% mkdir %ORDNERNAME%

for /f "delims=. tokens=1,2" %%h in ('dir /a:-d /b *.SQL') do (	  
	set /a counter=1
	for /f "tokens=1,4 delims=: " %%j in ('findstr /n /c:"CREATE TABLE" %%h.%%i') do (  
		set /a %%h_ZeileAb_!counter!=%%j 
		set %%h_Procedurename_!counter!=%%k
		set /a counter=!counter! + 1
	)
	
	set /a counter=!counter! - 1
	for /l %%k in (1 1 !counter!) do (
		set GEFUNDEN=FALSE
		for /f "delims=:" %%l in ('findstr /n /c:";" %%h.%%i') do (  
			if %%l gtr !%%h_ZeileAb_%%k! if !GEFUNDEN!==FALSE (
				set /a %%h_ZeileBis_%%k=%%l
				set GEFUNDEN=TRUE
			)
		)
	)
	
	for /l %%m in (1 1 !counter!) do (	
		REM ######### UPDATE PROCEDURE #########
		set FILENAME=%ORDNERNAME%\update_!%%h_Procedurename_%%m!.sql
		if exist !FILENAME! del !FILENAME!
		
		echo CREATE PROCEDURE update_!%%h_Procedurename_%%m! ( >> !FILENAME!
		for /f "tokens=1,2,3 delims=:	 " %%n in ('findstr /n "^" %%h.%%i') do (  
			set /a ZeileAb=!%%h_ZeileAb_%%m!+1
			set /a ZeileBis=!%%h_ZeileBis_%%m!-2
			if %%n gtr !ZeileAb! if %%n leq !ZeileBis! (
				echo 						@%%o %%p, >> !FILENAME!
			)
		)
		echo 						@index int, >> !FILENAME!
		echo 						@return_code int=0 OUTPUT ^) AS >> !FILENAME!
		echo update !%%h_Procedurename_%%m! >> !FILENAME!
		echo SET >> !FILENAME!

		for /f "tokens=1,2,3 delims=:	 " %%n in ('findstr /n "^" %%h.%%i') do (  
			set /a ZeileAb=!%%h_ZeileAb_%%m!+1
			set /a ZeileBis=!%%h_ZeileBis_%%m!-2
			if %%n gtr !ZeileAb! if %%n leq !ZeileBis! (
				if not %%n equ !ZeileBis! (
					echo 	%%o = @%%o, >> !FILENAME!
				) else (
					echo 	%%o = @%%o >> !FILENAME!
				)
			)
		)	
		echo where id = @index >> !FILENAME!
		echo select @return_code = @@ERROR>> !FILENAME!
		echo go >> !FILENAME!
	)
)

Gibt es noch Verbesserungsbedarf?