balegor
Goto Top

ECHO ist ausgeschaltet (OFF)

Hallo,
ich habe folgendes Problem, ich möchte eine Zeile komplett aus einer text datei löschen

@echo off &setlocal enabledelayedexpansion

set "Von1=CONNECT TO admin IN EXCLUSIVE MODE;"   
set "Nach1="  

for /f "usebackq delims=" %%i in ("%t%") do (   
   set "Line=%%i"   
   set "Line=!Line:%Von1%=%Nach1%!" & >>"%s%" echo !Line!  
)

allerdings bekomme ich dann in der Ausgabedatei
anstelle der gelöschten Zeile: ECHO ist ausgeschaltet (OFF). (wo eigentlich nichts mehr stehen sollte)
So nun zu meiner Frage, wie bekomme ich das weg so das da wircklich eine leere Zeile bzw. die Zeile einfach ganz gelöscht ist hin (je nachdem was einfacher ist face-smile)?

Und dann hab ich noch eine Frage, ich suche nach einem bestimmten String und möchte dann alles was bis zu einem andern String steht löschen, egal was dazwischen steht, und es durch einen anderen String ersetzen z.B.

CREATE UNIQUE INDEX nation_name_idx ON nation(n_name) INCLUDE(n_regionkey);

ab INCLUDE bis zum ; soll alles durch ein ; ersetzt werden. Es soll also egal sein was zwischen INCLUDE und dem ; steht (da sich das ab und zu ändert).

Grüße,
Balegor

Content-ID: 214259

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

Ausgedruckt am: 26.11.2024 um 17:11 Uhr

bastla
bastla 14.08.2013 aktualisiert um 09:29:25 Uhr
Goto Top
Hallo Balegor!

Etwa so:
set "Line=!Line:%Von1%=%Nach1%!" & >>"%s%" echo(!Line!
wobei sich das (wenn Du nur ausgeben und sonst nix mehr mit der veränderten Zeile anstellen willst) noch auf
>>"%s%" echo(!Line:%Von1%=%Nach1%!
verkürzen lassen sollte ...

Grüße
bastla
Pope35i
Pope35i 14.08.2013 aktualisiert um 09:31:36 Uhr
Goto Top
Hallo,
ich kann das Szenario gerade nicht nachstellen, aber ich Vermute, dass der fehler im Bereich von

& >>"%s%" echo !Line! 

liegt.

Wahrscheinlich ist !Line! leer und er gibt ein echo leer aus.

Bsp.: Kopiere dies in eine .bat bat datei und führe sie aus.

@echo off 
echo test
echo
pause

Dort siehst du dann, das "leere"-echo gibt deinen Fehler aus.

Viele Grüße.
Balegor
Balegor 14.08.2013 um 11:50:14 Uhr
Goto Top
danke @bastla, tatsächlich hat nur die eine klammer auf nach dem echo bei mir gefehlt.
Balegor
Balegor 14.08.2013 um 18:08:34 Uhr
Goto Top
ich hab hier im forum folgende .bat gefunden, die eine Datei für die Ersetztungen ausliest

@echo off & setlocal enabledelayedexpansion
set "Datei=D:\Test.txt"  
set "Liste=D:\Ersetzungsliste.txt"  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
goto :eof

:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%t%" echo\& goto :eof  
for /f "usebackq tokens=1-2 delims=;" %%s in ("%Liste%") do set "L=!L:%%s=%%t!"  
>>"%t%" echo %L%  
goto :eof

die hab ich per copy paste einfach so übernommen und meine Dateinamen angepasst (und das Trennzeichen in Zeile 14), jetzt spuckt er mir nach dem move in Zeile 8 aber nen Faehler aus "Das System kann die angegebene Datei nicht finden". Kann mir jmd sagen wo der Fehler liegt?
hier nochmal meine geänderte .bat

@echo on & setlocal enabledelayedexpansion

set "Datei=create.txt"  
set "Liste=Ersetzungsliste.txt"  
set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
goto :eof 

pause
:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%t%" echo\& goto :eof  
for /f "usebackq tokens=1-2 delims=," %%s in ("%Liste%") do set "L=!L:%%s=%%t!"  
>>"%t%" echo %L%  
goto :eof 

pause

und hier meine ersetztungsliste:
@,;
CONNECT TO admin IN EXCLUSIVE MODE,

und ein schnipsel der create.txt

CREATE DATABASE admin@
CONNECT TO admin IN EXCLUSIVE MODE@

CREATE TABLE region (
   r_regionkey  INTEGER  NOT NULL,
   r_name       CHAR(25),
   r_comment    VARCHAR(152),

   CONSTRAINT region_pk PRIMARY KEY(r_regionkey)
)@
bastla
bastla 14.08.2013 um 19:00:20 Uhr
Goto Top
Hallo Balegor!

Bis auf die Tatsache, dass nur Zeilen, die mit einer Zeilenschaltung enden, verarbeitet werden (und damit Deine letzte Zeile aus der "create.txt") auf der Strecke bleibt), kann ich eigentlich keinen Fehler finden ...

... und mit
for /f "delims=" %%i in ('findstr /n "^" "%Datei%"') do set "Line=%%i" & call :ProcessLine
ließe sich auch der beheben..

Grüße
bastla
Balegor
Balegor 14.08.2013 um 19:22:43 Uhr
Goto Top
hab das besagte geändert und die text.tmp in eine test.txt umgewandelt

@echo on & setlocal enabledelayedexpansion

set "Datei=create.txt"  
set "Liste=Ersetzungsliste.txt"  
set "t=test.txt"  
if exist "%t%" del "%t%"  
for /f "delims=" %%i in ('findstr /n "^" "%Datei%"') do set "Line=%%i" & call :ProcessLine  
move "%t%" "%Datei%"  
goto :eof  

pause
:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%t%" echo\& goto :eof  
for /f "usebackq tokens=1-2 delims=," %%s in ("%Liste%") do set "L=!L:%%s=%%t!"  
>>"%t%" echo %L%  
 goto :eof  

pause

an der create.txt ändert sich gar nichts und in der test.txt steht nur

CREATE DATABASE admin;
bastla
bastla 14.08.2013 um 19:43:36 Uhr
Goto Top
Hallo Balegor!

Ich kann mich ja nur an Deinen geposteten Daten orientieren - und damit klappt's ...

BTW: Die beiden Zeilen mit "pause" hätten nur jeweils vor dem "goto :eof" Sinn - dort, wo sie jetzt sind, werden sie nie erreicht.

Grüße
bastla
Balegor
Balegor 14.08.2013 aktualisiert um 20:16:33 Uhr
Goto Top
ich hab jetzt noch ein bisschen rumprobiert und hab jetzt folgende Ausgangsdatei create1.txt (Auszug):

 CREATE DATABASE admin; 
 CONNECT TO admin IN EXCLUSIVE MODE; 
 CREATE TABLE region ( 
    r_regionkey  INTEGER  NOT NULL, 
    r_name       CHAR(25), 
    r_comment    VARCHAR(152), 
    CONSTRAINT region_pk PRIMARY KEY(r_regionkey) 
 ); 
 
 LOAD FROM /home/db2prak/admprak/db2i00/sample-db/region.tbl OF DEL 
    MODIFIED BY coldel| 
    REPLACE INTO region 
    STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL 
    COPY NO 
    CPU_PARALLELISM 4 
    INDEXING MODE REBUILD; 
 LOAD FROM /home/db2prak/admprak/db2i00/sample-db/nation.tbl OF DEL 
    MODIFIED BY coldel| 
    REPLACE INTO nation 
    STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL 
    COPY NO 
    CPU_PARALLELISM 4 
    INDEXING MODE REBUILD; 

folgende Ersetzungsliste.txt
CONNECT TO admin IN EXCLUSIVE MODE;,
 INCLUDE(n_regionkey),
LOAD FROM,COPY

und folgende .bat
@echo on & setlocal enabledelayedexpansion

set "Datei=create1.txt"  
set "Liste=Ersetzungsliste.txt"  
set "s=create4.txt"  
if exist "%s%" del "%s%"   
for /f "delims=" %%i in ('findstr /n "^" "%Datei%"') do set "Line=%%i" & call :ProcessLine  
move "%s%" "create4.sql"  
goto :eof 


:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%s%" echo\& goto :eof  
for /f "usebackq tokens=1-2 delims=," %%q in ("%Liste%") do set "L=!L:%%q=%%s!"  
>>"%s%" echo( %L%  
 goto :eof 

und hab jetzt folgendes Problem, er tut das 2te LOAD FROM nicht ersetzten bzw schmeißt nach dem ersten
LOAD FROM /home/db2prak/admprak/db2i00/sample-db/region.tbl OF DEL
alles weg und er schreibt mir bei jeder Ersetztung ein %s in die create4.txt

EDIT: so sieht meine create4.txt dann aus:
  CREATE DATABASE admin; 
  %s 
  CREATE TABLE region ( 
     r_regionkey  INTEGER  NOT NULL, 
     r_name       CHAR(25), 
     r_comment    VARCHAR(152), 
     CONSTRAINT region_pk PRIMARY KEY(r_regionkey) 
  ); 
  
  %s /home/db2prak/admprak/db2i00/sample-db/region.tbl OF DEL 
bastla
bastla 14.08.2013 um 20:47:07 Uhr
Goto Top
Hallo Balegor!

Bevor wir uns noch lange mit diesem Batch herumplagen, lieber die VBS-Variante:
Datei = "create1.txt"  
Liste = "Ersetzungsliste.txt"  
s = "create4.txt"  
Delim = ","  

Set fso = CreateObject("Scripting.FileSystemObject")  
Ersetzungen = Split(fso.OpenTextFile(Liste).ReadAll, vbNewline)
Inhalt = fso.OpenTextFile(Datei).ReadAll

For Each Ersetzung In Ersetzungen
    If Trim(Ersetzung) <> "" Then Inhalt = Replace(Inhalt, Split(Ersetzung, Delim)(0), Split(Ersetzung, Delim)(1))  
Next

fso.CreateTextFile(s).Write Inhalt
Grüße
bastla
Balegor
Balegor 14.08.2013 um 21:23:37 Uhr
Goto Top
hmm, ich bin kompletter neuling was skript sachen angeht, hab jetzt halt versucht mich bissl mit .bat zu beschäftigen (was wohl ne schlecht wahl war^^)
von .vbs hab ich halt jetzt gar keine ahnung.
hab mir jetzt ne .vbs mit dem inhalt erstellt und die macht genau nichts. kp was ich falsch mache und ich glaub nicht das du lust und zeit hast mir hier jede kleinigkeit hinzubiegen
bastla
bastla 14.08.2013 um 21:38:50 Uhr
Goto Top
Hallo Balegor!
mit .bat zu beschäftigen (was wohl ne schlecht wahl war^^)
Würde ich nicht so pauschal stehen lassen - Suchen/Ersetzen ist aber nicht unbedingt eine Stärke von Batch.
hab mir jetzt ne .vbs mit dem inhalt erstellt und die macht genau nichts.
Schwer vorstellbar (auch, da von mir mit den von Dir geposteten Beispieldateien getestet); zumindest eine "create4.txt" müsste erstellt werden (und wenn sie auch den genau gleichen Inhalt wie "create1.txt" haben sollte).

Füge zum Testen zwischen Zeile 10 und 11 noch
WScript.Echo Ersetzung & vbNewline & "===================="
ein und starte das Script aus der CMD-Shell mit
cscript //nologo "DeinScript.vbs"
Es müssten jetzt die einzelnen Zeilen aus der "Ersetzungsliste.txt", getrennt durch "====================", ausgegeben werden - wenn nicht, könnte ich mir das nur damit erklären, dass Du "Nicht-Windows-Zeilenschaltungen" (CR + LF) in der Datei hast, oder dass die Textdateien in Unicode vorlägen ...

Grüße
bastla
Balegor
Balegor 14.08.2013 um 22:09:10 Uhr
Goto Top
ja, macht jetzt was es soll, kp was vorhin schief lief und das mit der trennlinie hat auch geklappt. das einzige problem was ich jetzt noch habe ist, das ich ja vorher mit der. bat schon bissl an der ausgangsdatei rumgebastelt hab und ich keine idee hab wie ich das mit vbs jetzt "nachbatseln kann"
bastla
bastla 14.08.2013 um 22:15:46 Uhr
Goto Top
Hallo Balegor!

Du kannst sämtliche benötigten Ersetzungen in die "Ersetzungsliste.txt" eintragen (Achtung: Groß-/Kleinschreibung werden berücksichtigt) und das Script damit laufen lassen - oder die schon teilweise aufbereitete Datei als Ausgangspunkt in Zeile 1 eintragen.

Grüße
bastla
Balegor
Balegor 14.08.2013 um 22:28:39 Uhr
Goto Top
eine frage hätte ich noch, da ich das ganze doch nur mit einem skript machen wollen würde, da ich das ganze ja auch irgentwie meinem betreuer erklären muss, warum ich jetzt aufeinmal mit 2 skripten rumgespielt hab ^^

wie kann ich ab einem bestimmten string den rest der datei löschen?
also ich hab irgentwo in der datei stehen: -- bis hier her
und ab da soll der rest der datei (inklusive das strings gelöscht werden)
bastla
bastla 14.08.2013 um 22:35:27 Uhr
Goto Top
Hallo Balegor!

Ändere die letzte Zeile auf
fso.CreateTextFile(s).Write Split(Inhalt, "--  bis hier her")(0)
Grüße
bastla
Balegor
Balegor 14.08.2013 um 22:54:37 Uhr
Goto Top
oh man vielen herzlichen dank, ich glaub ohne dich hätte ich hier kein land gesehen
Biber
Biber 14.08.2013 aktualisiert um 23:21:00 Uhr
Goto Top
Moin Balegor,

ich weiss nicht, ob dir bewusst ist, wie oft du hier die Ebenen der Fragestellung wechselst - das macht es nicht einfacher, dir wirklich zu helfen.

Angefangen hast du mit einer "ECHO ist eingeschaltet"-Meldung, die dich unerwartet traf.
Diese Frage ist seit 50 Beitragszentimetern hinreichend beantwortet.

Nächster Abschnitt war ein String-Ersetzen per Batch - was machbar ist, aber wobei Batch nicht unbedingt das beste Werkzeug darstellt.

Das wäre auch die Antwort auf die Frage der Phase 3 aka "Wie erklär ich das dem Cheffe?"

Zitat von @Balegor:
eine frage hätte ich noch, da ich das ganze doch nur mit einem skript machen wollen würde, da ich das ganze ja auch
irgentwie meinem betreuer erklären muss, warum ich jetzt aufeinmal mit 2 skripten rumgespielt hab ^^
Antwort: Weil die Aufgabe das Hauptanliegen ist, die Wahl des Werkzeugs ist untergeordnet.

Ich fürchte allerdings,, wir kommen bald zu Phase 4, nämlich die Frage, ob die Strategie deines DDL-Generators so ganz der richtige Weg ist.

Klar sehen sich alle 78 Tabellenobjekte in einer Datenbank irgendwie ähnlich.
Klar könnte es eine Strategie sein, nur eine Tabelle manuell zu definieren und danach die Tabellen 2 bis 78 per Copy&Paste und anschliessendem Ersetzen von Feld- und Constraintnamen abzuleiten.

Allerdings arbeiten die meisten der 3 Millionen inzwischen zusammengeschroteten SQL-Generatoren ein bisschen anders - zum Beispiel mit "festen" Template-Texten, in denen "variable Platzhalter" wie @ dbname, @ colname, @ Pkname aus Parameterdateien dazugemischt werden.

Diese gängige Variante hat sich irgendwie mehr durchgesetzt in freier Wildbahn.
Bist du sicher, dass du mit deiner Strategie wirklich alle Datenbankobjekte ohne Verrenkungen und vor allem ohne ständige Codeanpassungen hinbekommen kannst?

Ich meine, wir haben uns hier im Forum schon mehrfach ausschliesslich mit der Beantwortung der rein handwerklichen Problematik begnügt, weil der Fragesteller es bewusst darauf reduzierte.

Aber vielleicht magst du ja auch mal kurz die ganze Frage hier stellen und wir können dann nach einer Lösung suchen.

Grüße
Biber
Balegor
Balegor 15.08.2013 aktualisiert um 00:37:48 Uhr
Goto Top
die aufgabe war einfach nur eine create.sql die für db2 gedacht war so umzubasteln das man sie mit postgresql nutzen kann.
da postgresql nicht mit lob´s zurechtkommt (wurde mir zumindest so gesagt), war der schnitt in der datei und der rest war nur noch suchen und ersetzen
aber da ich vorher noch nie irgentwelche skripte angefasst hab, war das nicht ganz so einfach für mich