pantherstyle
Goto Top

Zählschleife

Hallo, ich habe eine ähnliche Frage schonmal gestellt, kann sie aber nicht mehr finden. Ich habe folgenden Quellcode:
:: Einfügen der Struktur Dateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo Zeitstempel: >> %HELP_PATH%\install_backend.sql 
set anz=0 
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertstrukt.txt) do call :zwei %%i\%%j  
goto :eins 
:eins
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neustrukt.txt) do call :drei %%i\%%j  
goto :ENDE
:zwei 
set /a anz=%anz%+1 
echo print 'verStrk %anz%' >> %HELP_PATH%\install_backend.sql   
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :ENDE
:drei
set /a anz=%anz%+1 
echo print 'NewStrk %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :ENDE
echo Zeitstempel: >> %HELP_PATH%\install_backend.sql 
:ENDE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Einfügen der restlichen Dateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo Zeitstempel: >> %HELP_PATH%\install_backend.sql 
set anz=0 
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertnorm.txt) do call :count %%i\%%j  
goto :weiter 
:weiter
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neunorm.txt) do call :zaehl %%i\%%j  
goto :EOF
:count 
set /a anz=%anz%+1 
echo print 'ChangeNorm %anz%' >> %HELP_PATH%\install_backend.sql   
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:zaehl
set /a anz=%anz%+1 
echo print 'NewNorm %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
echo Zeitstempel: >> %HELP_PATH%\install_backend.sql 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Wie man sieht sollen die 4 Schleifen hochgezählt werden, um ein Ergebnis in etwa der folgenden Form zu liefern:

Zeitstempel:
print 'verStrk 1'
--:r ".\Schema\BI_STAMMDATEN_EXCHANGERATES_REVIEW.sql"
print 'neuStrk 1'
--:r ".\Schema\BI_BILLING_HISTORY_INSERT_SELECT.sql"
Zeitstempel:
print 'ChangeNorm 1'
--:r ".\P\BI_BILLING_HISTORY_INSERT.sql"
print 'ChangeNorm 2'
--:r ".\P\BI_BILLING_HISTORY_INSERT_SELECT.sql"
print 'ChangeNorm 3'
--:r ".\P\BI_EPM_IMPORT.sql"
print 'NewNorm 1'
--:r ".\P\BI_STAMMDATEN_PROJECTS_IMPORT_SELECT.sql"
print 'NewNorm 2'
--:r ".\P\BI_STAMMDATEN_PROJECTS_REVIEW.sql"
print 'NewNorm 3'
--:r ".\P\BI_STAMMDATEN_PROJECTS_REVIEW_SELECT.sql"
Zeitstempel:

Allerdings sieht das Ergebnis noch so aus, dass die 1. Schleife 1 mal, die 2. Schleife nicht, aber die 3. und 4. voll durchlaufen werden.
Wie muss der Code entsprechend geändert werden? Bin für jede Hilfe dankbar!

Content-Key: 113885

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

Printed on: April 16, 2024 at 18:04 o'clock

Mitglied: 60730
60730 Apr 15, 2009, updated at Oct 18, 2012 at 16:37:59 (UTC)
Goto Top
Zitat von @Pantherstyle:
Hallo, ich habe eine ähnliche Frage schonmal gestellt, kann sie aber nicht mehr finden.

Servus,

Ist bei fast unüberschaubaren 7 Beiträgen aber nun wirklich kein Hexenwerk.
Voila - ging ganz schnell face-wink


Vor lauter Wald sehe ich leioder den Baum nicht mehr - aber wundere mich über Zeile 30 & 31:

30. goto :weiter
31.:weiter

Magst du das etwas besser organsieren?
Dann wäre das mit dem Helfen auch schöner.

gruß
Member: Diskilla
Diskilla Apr 15, 2009 at 09:20:52 (UTC)
Goto Top
Genau das wollte ich auch gerade machen.
Du kannst im Menü links auf Meine Inhalte gehen und da alle deine Beiträge sehen.

Nur so als Tip fürs nächste Mal.

Greetz Diskilla
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 09:28:24 (UTC)
Goto Top
Ich habe das mit dem Mein Inhalte noch nicht gesehen und zum Suchen habe ich die Suchfunktion genutzt (etwas schwer wenn man den namen nicht mehr weis) Bei direkter Suche hatte ich nicht geschaut. Ich hoffe es ist okay, wenn der Beitrag erstmal hier bleibt.

Das mit dem weiter habe ich nicht in Frage gestellt, da ich im Allgemeinen nicht dahinter komme wie das funktionieren kann. Wäre trotzdem nett wenn ihr mich mit der Nase in die Fehler tunken könntet. Das mit dem weiter ist an sich schon unlogisch...
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 09:30:45 (UTC)
Goto Top
Ich habe es gerade getestet, ohne das weiter funktioniert es nicht mehr.
Member: Biber
Biber Apr 15, 2009 at 09:33:10 (UTC)
Goto Top
Moin Steilpanda,

und als weitere zwei Tipps fürs Gröbste.
  • einzelne CALL :whatever-Blöcke beginnen mit ":blockname" (hast du) und MÜSSEN mit "goto :eof" abgeschlossen werden
  • einzige Ausnahme ist ein geCALLter Block, dessen letzte zeile auch gleichzeitig die letze Codezeile des gesamten batches ist - dann kann ein "goto :eof" entfallen
  • noch deutlicher gesagt - es darf NICHT alternativ ein "goto :ENDE" oder "goto :Hell" am CALL-Blockende stehen, nur "goto :eof" wird als "kehre zurück zur aufrufenden Batchzeile" interpretiert
  • weiterer Tipp: Zeile 21 ist unerreichbar (wird nie ausgeführt), da unmittelbar davor ein unbedingtes "goto :Woanders" steht

Grüße
Biber
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 09:45:22 (UTC)
Goto Top
Dieser Code stammt leider nicht von mir. Ich habe in bestimmt mer als eine halbe Stunde studiert, aber nicht entschlüsseln können, zumal mir die wirkung von eof in diesem Zusammenhang vollständig logisch erscheint. Bitte geht es etwas konkreter mit den Hilfen?
Member: Biber
Biber Apr 15, 2009 at 10:42:07 (UTC)
Goto Top
Moin Panda,

dann aber vorher noch mal die Rückfrage bzw. Bitte:
Kannst Du den vollständigen Code posten?
Denn es fehlen zumindest die Zeilen, in denen die Variablen %HELP_PATH% usw. definiert werden.

Und dann ziehen wir es auch umgehend glatt.

Grüße
Biber
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 10:43:48 (UTC)
Goto Top
Na Klar doch:
echo off
::
:: Dieses tool dient der Erstellung einer Installationsroutine für SQL Dateien
:: und ist im Zusammenhang mit dem Difftool.bat zu verwenden, da dieses die
:: Ausgangstextdateien liefert. 
::

:: Angabe der Pfade durch den User
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Pfad zur PrologSqlInstall.txt Datei
set PROLOG_PATH=C:\Arbeitskopie\trunk\Daten\SoftwarePaket\Batch-Dateien\Difftools
:: Pfad wo die Ergebnisse angelegt werden sollen
set HELP_PATH=C:\Arbeitskopie\SqlInstall
::Pfad zu den Ergebnissen von Difftool
set DIFFTOOL_PATH=C:\Arbeitskopie\Hilfsordnerbflexxdateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Vorbereitung der Pfade
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
rd %HELP_PATH% /s /q
mkdir %HELP_PATH%
echo > %HELP_PATH%\install_backend.sql
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Einlesen des Prologs
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
copy %PROLOG_PATH%\PrologSqlInstall.txt %HELP_PATH%\install_backend.sql
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Einfügen der sql Logik
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo. >> %HELP_PATH%\install_backend.sql
echo print convert(varchar, getdate(), 114)+':Starting installation' >> %HELP_PATH%\install_backend.sql  
echo --go at least >> %HELP_PATH%\install_backend.sql
echo go >> %HELP_PATH%\install_backend.sql
echo -- call create function script >> %HELP_PATH%\install_backend.sql
echo print convert(varchar, getdate(), 114)+' Part 1:' >> %HELP_PATH%\install_backend.sql  
echo -- install all utility function first >> %HELP_PATH%\install_backend.sql
echo installchanges: -- Sprungziel >> %HELP_PATH%\install_backend.sql
echo -- Zeitstempel vorher ausgeben >> %HELP_PATH%\install_backend.sql
echo print convert(varchar, getdate(), 114)+' Part 6: Changing procedures' >> %HELP_PATH%\install_backend.sql  
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo Ihre SQL Installationsdatei wird erstellt, Sie finden diese unter:
echo %HELP_PATH%\install_backend.sql
echo Bitte fuegen Sie der erstellten Datei folgende CodeZeile als Schlusszeile hinzu
echo print convert(varchar, getdate(), 114)+':Installation done.'  
Pause

:: Einfügen der Dateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set anz=0 
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendert.txt) do call :count %%i\%%j  
goto :weiter 
:weiter
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neu.txt) do call :zaehl %%i\%%j  
goto :EOF
:count 
set /a anz=%anz%+1 
echo print 'Change %anz%' >> %HELP_PATH%\install_backend.sql   
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:zaehl
set /a anz=%anz%+1 
echo print 'New %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Zeitstempel ende
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo print convert(varchar, getdate(), 114)+':Installation done.' >> %HELP_PATH%\install_backend.sql  
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Member: Biber
Biber Apr 15, 2009 at 12:33:48 (UTC)
Goto Top
Moin Panda,

dann wären das so die Korrekturen, die mir im ersten Anlauf ein- und auffallen:

echo off & setlocal
::
:: Dieses tool dient der Erstellung einer Installationsroutine für SQL Dateien
:: und ist im Zusammenhang mit dem Difftool.bat zu verwenden, da dieses die
:: Ausgangstextdateien liefert. 
::

:: Angabe der Pfade durch den User
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Pfad zur PrologSqlInstall.txt Datei
set "PROLOG_PATH=C:\Arbeitskopie\trunk\Daten\SoftwarePaket\Batch-Dateien\Difftools"  
:: Pfad wo die Ergebnisse angelegt werden sollen
set "HELP_PATH=C:\Arbeitskopie\SqlInstall"  
::Pfad zu den Ergebnissen von Difftool
set "DIFFTOOL_PATH=C:\Arbeitskopie\Hilfsordnerbflexxdateien"  
Set "newSql=%HELP_PATH%\install_backend.sql"  
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Vorbereitung der Pfade
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
rd %HELP_PATH% /s /q
mkdir %HELP_PATH%
echo.> %newSQL%
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Einlesen des Prologs
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
copy %PROLOG_PATH%\PrologSqlInstall.txt %newSQL%
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Einfügen der sql Logik
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo. >> %newSQL%
echo print convert(varchar, getdate(), 114)+':Starting installation' >> %newSQL%  
echo --go at least >> %newSQL%
echo go >> %newSQL%
echo -- call create function script >>%newSQL%
echo print convert(varchar, getdate(), 114)+' Part 1:' >>%newSQL%  
echo -- install all utility function first >>%newSQL%
echo installchanges: -- Sprungziel >>%newSQL%
echo -- Zeitstempel vorher ausgeben >>%newSQL%
echo print convert(varchar, getdate(), 114)+' Part 6: Changing procedures' >>%newSQL%  
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo Ihre SQL Installationsdatei wird erstellt, Sie finden diese unter:
echo.%newSQL%
echo Bitte fuegen Sie der erstellten Datei folgende CodeZeile als Schlusszeile hinzu
echo print convert(varchar, getdate(), 114)+':Installation done.'  
Pause

:: Einfügen der Dateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /a anz=0 
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendert.txt) do call :count %%i\%%j  
REM #Bugfix s.u #  hier steht besser kein Goto :LetzteZeile


:weiter
set /a anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neu.txt) do call :zaehl %%i\%%j  
REM #Bugfix s.u # hier steht besser kein goto :EOF
Goto :LetzteZeile
:count 
set /a anz=%anz%+1 
echo print 'Change %anz%' >>%newSQL%  
echo --:r ".\%*" >>%newSQL%  
goto :EOF

:zaehl
set /a anz=%anz%+1 
echo print 'New %anz%' >>%newSQL%  
echo --:r ".\%*" >>%newSQL%  
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Zeitstempel ende
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:LetzteZeile
echo print convert(varchar, getdate(), 114)+':Installation done.' >>%newSQL%  
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[ungetestet]

Grüße
Biber
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 12:46:59 (UTC)
Goto Top
Es funktioniert, aber es macht nur einen einzigen Durchlauf für Change. Ich benötige allerdings alle 4 Durchläufe.
Jetziges Ergebnis:

print 'Change 1'
--:r ".\FN\BfxFctMasterGetOption.sql"
print 'Change 2'
--:r ".\FN\UTIL_isFileExistent.sql"
print 'Change 3'
etc....

Da war es vorher besser denn es hat noch new usw. mit angezeigt ;D...

Wie muss das umgebaut werden, damit es meine 4 Dateien ausliest und hochzählt? Ich meine so wie im 1. Post beschrieben.
Member: Biber
Biber Apr 15, 2009 at 12:55:03 (UTC)
Goto Top
Moin,

na ja, dieser Batch ist ja sozusagen data driven ... ob da nun 2 oder 7 oder 11 Dateien ausgelesen und hochgezählt werden, hängt ja davon ab, was in der "DIFFTOOL_PATH%\veraendert.txt" und der "%DIFFTOOL_PATH%\neu.txt" an Dateinamen steht.

Was steht den jetzt z.B. darin?

Grüße
Biber
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 13:09:03 (UTC)
Goto Top
Dort stehen exakt die Dinge drin die du oben lesen kannst z.B. FN\BfxFctMasterGetOption.sql

Allerdings wird in dem von dir geposteten Text neu.txt gar nicht ausgelesen bzw. verwendet. Die 4 Dokumente aus denen gelesen wird (veraendertstrukt.txt, neustrukt.txt, veraendertnorm.txt und neunorm.txt) enthalten mehrere Dutzend dieser Dateinamen.

Diese sollen wie in der oben beschriebenen Form untereinander ín die sqlinstall Datei geschrieben werden.
Member: Pantherstyle
Pantherstyle Apr 15, 2009 at 13:10:50 (UTC)
Goto Top
Ich hätte mir dies in etwa so vorgestellt:
:: Einfügen der Dateien
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set anz=0 
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertstrukt.txt) do call :zaehleins %%i\%%j  
goto :eins 
:eins
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neustrukt.txt) do call :zaehlzwei %%i\%%j  
goto :zwei
:zwei
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertnorm.txt) do call :zaehldrei %%i\%%j  
goto :drei
:drei
set anz=0 
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neunorm.txt) do call :zaehlvier %%i\%%j  
goto :EOF
:zaehleins 
set /a anz=%anz%+1 
echo print 'ChangeStrukt %anz%' >> %HELP_PATH%\install_backend.sql   
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:zaehlzwei
set /a anz=%anz%+1 
echo print 'NewStrukt %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:zaehldrei
set /a anz=%anz%+1 
echo print 'ChangedNorm %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:zaehlvier
set /a anz=%anz%+1 
echo print 'ChangedStrukt %anz%' >> %HELP_PATH%\install_backend.sql  
echo --:r ".\%*" >> %HELP_PATH%\install_backend.sql   
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Member: Biber
Biber Apr 15, 2009 at 14:44:28 (UTC)
Goto Top
Moin Panda,

sorry, ich war da zu schwungvoll...
  • das neu reingebrachte "goto :letzteZeile" in meiner vorhin geposteten Zeile 55 muss DORT RAUS
  • und statt dessen in die Zeile 61 (wo jetzt ein "goto :Eof" steht. Ich ändere es oben auch im Source.


Grüße
Biber
Member: Pantherstyle
Pantherstyle Apr 16, 2009 at 06:11:25 (UTC)
Goto Top
Wie gesagt, wäre ich auch mit deinem Tipp noch am Anfang, Sinn der Ganzen Sache ist es, das Programm 4 Schleifen durchlaufen zu lassen für die 4 Dokumente die ich vorliegen habe.
Member: Pantherstyle
Pantherstyle Apr 16, 2009 at 07:58:14 (UTC)
Goto Top
Keiner eine Idee? oder ist die Aufgabenstellung unklar?
Member: Pantherstyle
Pantherstyle Apr 16, 2009 at 09:49:51 (UTC)
Goto Top
Ich habe noch einmal gebastelt und dabei folgenden Code erstellt:
set /a anz=0  
for /F "skip=1 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertstrukt.txt) do call :eins %%i\%%j   

set /a anz=0  
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neustrukt.txt) do call :zwei %%i\%%j  

set /a anz=0  
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\veraendertnorm.txt) do call :drei %%i\%%j  

set /a anz=0  
for /F "skip=3 tokens=1* delims=\" %%i in (%DIFFTOOL_PATH%\neunorm.txt) do call :vier %%i\%%j   
Goto :LetzteZeile 

:eins
set /a anz=%anz%+1  
echo print 'ChangeStrukt %anz%' >>%newSQL%   
echo --:r ".\%*" >>%newSQL%   
goto :EOF 

:zwei 
set /a anz=%anz%+1  
echo print 'NewStrukt %anz%' >>%newSQL%   
echo --:r ".\%*" >>%newSQL%   
goto :EOF 

:drei 
set /a anz=%anz%+1  
echo print 'ChangeNorm %anz%' >>%newSQL%   
echo --:r ".\%*" >>%newSQL%   
goto :EOF

:vier 
set /a anz=%anz%+1  
echo print 'NewNorm %anz%' >>%newSQL%   
echo --:r ".\%*" >>%newSQL%   
goto :EOF

Wie manns sich aber denken kann funktioniert der Code nicht. Irgendwie steige ich nicht so ganz hinter die Logik die da drin steckt. Warum funktioniert das nicht, bzw. was muss ich ändern damit es funktioniert, oder kann es vielleicht nicht funktionieren?

Wäre für jede Hilfe dankbar!