Batch Variable in Dateinamen
Hallo, ich hatte vor Tagen schon mal mein Problem mit der batch-Datei geschildert, ich komme aber nicht weiter
hallo,
das Problem war: aus einer zeilenweise aufgebauten Datei möchte ich per batch-script bestimmte Zeilen auslesen (geplant: 4 bestimmte Zeilen), von den (4) selektierten Zeilen jeweils die ersten 7 Zeichen entfernen (abschneiden) und aus den verbleibenden Zeileninhalten den Dateinamen erstellen.
Mit eurer Hilfe (Danke !!) läuft nachstehendes Script erstmal sehr gut, aber es verwendet nur 2 Zeilen der Ausgangsdatei:
@echo off
set vz=k:\doc2\user\user5
if exist %vz%\oat_roh.bdt del %vz%\oat_roh.bdt
if exist %vz%\oat_fein.bdt del %vz%\oat_fein.bdt
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %vz%\pat.bdt') do @(for /L %%a in (6,2,8) do @if %%i==%%a @echo %%j>>%vz%"\oat_roh.bdt")
for /f "delims=" %%f in (%vz%\oat_roh.bdt) do call :sprung1 "%%f"
goto ende
:sprung1
set "Quelle=%~1"
set "Ziel=%Quelle:~7%"
@echo %Ziel%>>%vz%"\oat_fein.bdt"
goto :sprung2
:sprung2
set /p roh=<%vz%\oat_fein.bdt
for /f "skip=1 delims=" %%f in (%vz%\oat_fein.bdt) do set "fein=%roh%%%f"
goto :eof
:ende
start "WORD" /MAX "k:\Dokumente\F\%fein%.doc"
durch Anpassen der ersten for-Schleife (4,2,10) gelingt es mir, die 4 betreffenden Zeilen in die "oat_roh" zu schreiben. Es gelingt auch, von diesen 4 Zeilen jeweils die ersten 7 Zeichen zu entfernen und in die "oat_fein" zu schreiben. Es gelingt mir aber nicht, diese 4 Zeilen zu einem Dateinamen zu formen. Es wird noch verrückter: der Dateiname sollte in der Reihenfolge "Zeile6Zeile8_Zeile10_Zeile4" erstellt werden (wäre aber nicht zwingend nötig, alternativ wäre die Reihenfolge "Zeile4Zeile6Zeile8Zeile10" möglich)
Ich wäre über Hinweise / Hilfe dankbar !
alexander
hallo,
das Problem war: aus einer zeilenweise aufgebauten Datei möchte ich per batch-script bestimmte Zeilen auslesen (geplant: 4 bestimmte Zeilen), von den (4) selektierten Zeilen jeweils die ersten 7 Zeichen entfernen (abschneiden) und aus den verbleibenden Zeileninhalten den Dateinamen erstellen.
Mit eurer Hilfe (Danke !!) läuft nachstehendes Script erstmal sehr gut, aber es verwendet nur 2 Zeilen der Ausgangsdatei:
@echo off
set vz=k:\doc2\user\user5
if exist %vz%\oat_roh.bdt del %vz%\oat_roh.bdt
if exist %vz%\oat_fein.bdt del %vz%\oat_fein.bdt
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %vz%\pat.bdt') do @(for /L %%a in (6,2,8) do @if %%i==%%a @echo %%j>>%vz%"\oat_roh.bdt")
for /f "delims=" %%f in (%vz%\oat_roh.bdt) do call :sprung1 "%%f"
goto ende
:sprung1
set "Quelle=%~1"
set "Ziel=%Quelle:~7%"
@echo %Ziel%>>%vz%"\oat_fein.bdt"
goto :sprung2
:sprung2
set /p roh=<%vz%\oat_fein.bdt
for /f "skip=1 delims=" %%f in (%vz%\oat_fein.bdt) do set "fein=%roh%%%f"
goto :eof
:ende
start "WORD" /MAX "k:\Dokumente\F\%fein%.doc"
durch Anpassen der ersten for-Schleife (4,2,10) gelingt es mir, die 4 betreffenden Zeilen in die "oat_roh" zu schreiben. Es gelingt auch, von diesen 4 Zeilen jeweils die ersten 7 Zeichen zu entfernen und in die "oat_fein" zu schreiben. Es gelingt mir aber nicht, diese 4 Zeilen zu einem Dateinamen zu formen. Es wird noch verrückter: der Dateiname sollte in der Reihenfolge "Zeile6Zeile8_Zeile10_Zeile4" erstellt werden (wäre aber nicht zwingend nötig, alternativ wäre die Reihenfolge "Zeile4Zeile6Zeile8Zeile10" möglich)
Ich wäre über Hinweise / Hilfe dankbar !
alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118798
Url: https://administrator.de/contentid/118798
Ausgedruckt am: 26.11.2024 um 05:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo Alexander. wieso fängst Du denn einen neuen Thread an? Naja egal...
Bitte setze deinen (Batch-)Code wenn möglich in Code Zeilen um diesen besser zu kopieren zur weiteren Bearbeitung durch andere Forumbenutzer. Danke
<code> Meine Batch Zeilen </code>
Achtung ungetestet bitte Feedback geben!
liest Zeile 6; 8; 10 und 4 aus
kann auch in der ersten FORschleife eine andere Reihenfolge (3 5 7 9) sein!
ist nur der Übersicht halber so geschrieben.
entfernt die ersten 7 Zeichen und öffnet wie angegeben das Dokument.
Gruß Phil
Bitte setze deinen (Batch-)Code wenn möglich in Code Zeilen um diesen besser zu kopieren zur weiteren Bearbeitung durch andere Forumbenutzer. Danke
<code> Meine Batch Zeilen </code>
Achtung ungetestet bitte Feedback geben!
@echo off & setlocal enabledelayedexpansion
:anf
for %%i in (5 7 9 3) do call :read %%i
if not defined clean (set clean=1 & goto :anf )
start "WORD" /MAX "k:\Dokumente\F\%5%%7%_%9%_%3%.doc" & goto :eof
:read
if defined clean set %1=!%1:~7! & goto :eof
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set %1=%%i & goto :eof
liest Zeile 6; 8; 10 und 4 aus
kann auch in der ersten FORschleife eine andere Reihenfolge (3 5 7 9) sein!
ist nur der Übersicht halber so geschrieben.
entfernt die ersten 7 Zeichen und öffnet wie angegeben das Dokument.
Gruß Phil
so habs getestet müsste jetzt gehen
lag wohl an den vielen %%
keine Ahnung?
@echo on & setlocal enabledelayedexpansion
:anf
for %%i in (5 7 9 3) do call :read %%i
if not defined read (set read=1 & goto :anf )
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"
goto :eof
:read
set Nr=%1
if not defined read goto :readin
if %1 == 9 set Ustrich=1
if not defined Ustrich (set "File=%File%!%Nr%:~ 7!") else set "File=%File%_!%Nr%:~ 7!" & goto :eof
:readin
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set %Nr%=%%i & goto :eof
lag wohl an den vielen %%
keine Ahnung?
da fehlen doch tatsächlich ein paar Gänsefüschen!
was das wieder einmal ausmacht.
wenn Du Irgenwelche Variablen setzt und auf der selben Zeile noch weiteren Code hast ( mit Befehlverkettung & ...) dann setzt Du immer Gänsefüschen.
Alternativ dazu hinter den set Befehl das & direkt "daranklatschen" ohne leerzeichen...
Muss ich gleich mal in meine BatchVariablen Anleitung eintragen..!
und zwar fehlte es in Zeile 13
Hier nochmal mit "Umgebenden"
Gruß Phil
was das wieder einmal ausmacht.
wenn Du Irgenwelche Variablen setzt und auf der selben Zeile noch weiteren Code hast ( mit Befehlverkettung & ...) dann setzt Du immer Gänsefüschen.
Alternativ dazu hinter den set Befehl das & direkt "daranklatschen" ohne leerzeichen...
Muss ich gleich mal in meine BatchVariablen Anleitung eintragen..!
und zwar fehlte es in Zeile 13
Hier nochmal mit "Umgebenden"
- so hier ist die:
mehrere Zeilen aus einer Datei in Unterschiedlicher Reihenfolge auslesen und die ausgelesenen Zeilen ohne die ersten 7 Zeichen jeder Zeile aneinanderfügen sowie ab einer bestimmten Zeile Unterstriche einfügen und einem Programm als Dateiname Übergeben .bat
@echo on & setlocal enabledelayedexpansion
:anf
for %%i in (5 7 9 3) do call :read %%i
if not defined read (set read=1 & goto :anf )
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"
goto :eof
:read
set Nr=%1
if not defined read goto :readin
if %1 == 9 set Ustrich=1
if not defined Ustrich (set "File=%File%!%Nr%:~ 7!") else set "File=%File%_!%Nr%:~ 7!" & goto :eof
:readin
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof
Gruß Phil
Hallo @alexander01,
ich habe mir mal erlaubt Deine Frage einfach hier wieder einzusetzten, da diese hier bestimmt besser aufgehoben ist und der Überblick behalten wird. ausserdem betrifft die Frage das Thema.
Zitat von @alexander01:
ich brauche das Script für zwei verschiedene Vorgänge, bei einem muß hinter Zeilenfragment 1 ein Komma und ein Leerzeichen, danach folgt Fragment 2
also: Fragment1, Fragment2__Fragment3
wie bekomme ich ein ", " (= Komma + Leerzeichen) in den String?
set "File=%File%, !%Nr%:~7!" funktioniert nicht,
set "File=%File%_ !%Nr%:~7!" funktioniert hingegen schon. Sicher wird das Komma falsch interpretiert.
... hierzu eine Idee?
Alexander
ich habe mir mal erlaubt Deine Frage einfach hier wieder einzusetzten, da diese hier bestimmt besser aufgehoben ist und der Überblick behalten wird. ausserdem betrifft die Frage das Thema.
Zitat von @alexander01:
ich brauche das Script für zwei verschiedene Vorgänge, bei einem muß hinter Zeilenfragment 1 ein Komma und ein Leerzeichen, danach folgt Fragment 2
also: Fragment1, Fragment2__Fragment3
wie bekomme ich ein ", " (= Komma + Leerzeichen) in den String?
set "File=%File%, !%Nr%:~7!" funktioniert nicht,
set "File=%File%_ !%Nr%:~7!" funktioniert hingegen schon. Sicher wird das Komma falsch interpretiert.
... hierzu eine Idee?
Alexander
Hallo Alexander,
Es scheitert keinesfalls am Komma.
Du hast die Klammern nicht abgeschlossen. Das ist ein wichtiges Detail und sollte nicht vergessen werden. Immer wenn eine Klammer geöffnet wird muss diese auch irgendwo wieder Geschlossen werden sonst kommt nur eine Fehlermeldung. Die wirst Du aber vllt nicht gesehen haben, weil sich das Fenster zu schnell geschlossen hat. Klammern fügen Befehle zusammen oder grenzen andere Befehle aus. Also zählst Du am besten von Befehlen: alle aufgehenden Klammern als PositiveWerte und alle abschliesenden Klammern als negative Werte (ausgeschlossen sind davon die Klammern aus Zeichenfolgen und gesetzten Variablen, wenn diese nicht als Befehlersatz eingesetzt werden) und dieser Wert sollte dann 0 ergeben.
Weil Du hinter dem IF kein ELSE Klausel hast, benötigst Du in Deinem Fall diese Klammer nicht.
Das & goto :eof benötigst Du eigentlich nur einmal auf der 15. Zeile oder einmal auf der 16. Zeile als goto :eof
In Deinem Fall kann es aber auch auf Zeile 13 bis 15 stehenbleiben. oder gar auch mit dem Anfang Deiner Ursprünglich dagelassenen EingangsKlammer am jeweiligen Zeilenende mit einer Abschliessenden Klammer wieder geschlossen werden.
der Effekt ist in Deiner Batch immer der selbe, da goto : readin dieses goto :eof Überspringt und durch die einzelnen Zeilenvergleiche nur für die passende Zeile die jeweilige Variable gesetzt wird.
in der Zeile 13 muss nicht unbedint hinter dem Gleichheitszeichen %File% stehen, weil ja die Variable File zu diesem Zeitpunkt noch gar nicht Existiert. Aber in diesem Fall kann es stehen bleiben es sollte nur stehenbleiben wenn mit einer einzigen Zeile die Komplette Variable (der Dateiname) generiert wird (siehe meinen Vorherigen Kommentar Code-Zeile 11.).
Das nächste ist die Sprungmarke :readin
diese muss um am Zeilenbeginn als Sprungmarke erkannt zu werden immer mit einem Doppelpunkt beginnen ansonsten wird die Zeile als Befehl Eingelesen. Im Gegensatz dazu kann man den Doppelpunkt hinter GOTO weglassen. dieser ist nicht unbedingt erforderlich aber wird meistens der Übersichtlichkeit halber in der Batch hinter GOTO gesetzt.
Gruß Phil
Es scheitert keinesfalls am Komma.
Du hast die Klammern nicht abgeschlossen. Das ist ein wichtiges Detail und sollte nicht vergessen werden. Immer wenn eine Klammer geöffnet wird muss diese auch irgendwo wieder Geschlossen werden sonst kommt nur eine Fehlermeldung. Die wirst Du aber vllt nicht gesehen haben, weil sich das Fenster zu schnell geschlossen hat. Klammern fügen Befehle zusammen oder grenzen andere Befehle aus. Also zählst Du am besten von Befehlen: alle aufgehenden Klammern als PositiveWerte und alle abschliesenden Klammern als negative Werte (ausgeschlossen sind davon die Klammern aus Zeichenfolgen und gesetzten Variablen, wenn diese nicht als Befehlersatz eingesetzt werden) und dieser Wert sollte dann 0 ergeben.
Weil Du hinter dem IF kein ELSE Klausel hast, benötigst Du in Deinem Fall diese Klammer nicht.
Das & goto :eof benötigst Du eigentlich nur einmal auf der 15. Zeile oder einmal auf der 16. Zeile als goto :eof
In Deinem Fall kann es aber auch auf Zeile 13 bis 15 stehenbleiben. oder gar auch mit dem Anfang Deiner Ursprünglich dagelassenen EingangsKlammer am jeweiligen Zeilenende mit einer Abschliessenden Klammer wieder geschlossen werden.
der Effekt ist in Deiner Batch immer der selbe, da goto : readin dieses goto :eof Überspringt und durch die einzelnen Zeilenvergleiche nur für die passende Zeile die jeweilige Variable gesetzt wird.
in der Zeile 13 muss nicht unbedint hinter dem Gleichheitszeichen %File% stehen, weil ja die Variable File zu diesem Zeitpunkt noch gar nicht Existiert. Aber in diesem Fall kann es stehen bleiben es sollte nur stehenbleiben wenn mit einer einzigen Zeile die Komplette Variable (der Dateiname) generiert wird (siehe meinen Vorherigen Kommentar Code-Zeile 11.).
Das nächste ist die Sprungmarke :readin
diese muss um am Zeilenbeginn als Sprungmarke erkannt zu werden immer mit einem Doppelpunkt beginnen ansonsten wird die Zeile als Befehl Eingelesen. Im Gegensatz dazu kann man den Doppelpunkt hinter GOTO weglassen. dieser ist nicht unbedingt erforderlich aber wird meistens der Übersichtlichkeit halber in der Batch hinter GOTO gesetzt.
@echo on & setlocal enabledelayedexpansion
:anf
for %%i in (5 7 3) do call :read %%i
if not defined read (set read=1 & goto :anf )
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"
goto :eof
:read
set Nr=%1
if not defined read goto :readin
if %1 == 5 set "File=%File%!%Nr%:~7!" & goto :eof
if %1 == 7 set "File=%File%, !%Nr%:~7!" & goto :eof
if %1 == 3 set "File=%File%__!%Nr%:~7!" & goto :eof
:readin
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof
Gruß Phil
hallo alex,
ich hatte vergessen zu erwähnen, dass eine Sprungmarke genauso heist wie sie bis zum ende der Zeichenfolge bezeichnet ist. das bedeutet, wenn eine Klammer direkt an den Namen der Sprungmarke OHNE Leerzeichen Angefügt wird wird ein anderer Sprungmarkenname daraus.
Wenn Du also mehrere Befehle mit Klammern zusammmenfügst achte darauf, dass zwischen einem goto :Sprungmarke und einer Abschliesenden Klammer ein Leerzeichen eingefügt ist.
also genau wie Deine Zeile 02. - die ist richtig.
Wieso hast Du nicht den Code Von meinem vorherigen Thread genommen?
Der war doch ok so?
(Da kam wohl Dein Ergeiz hinzu, um es selbst zu probieren)
Gruß Phil
ich hatte vergessen zu erwähnen, dass eine Sprungmarke genauso heist wie sie bis zum ende der Zeichenfolge bezeichnet ist. das bedeutet, wenn eine Klammer direkt an den Namen der Sprungmarke OHNE Leerzeichen Angefügt wird wird ein anderer Sprungmarkenname daraus.
Wenn Du also mehrere Befehle mit Klammern zusammmenfügst achte darauf, dass zwischen einem goto :Sprungmarke und einer Abschliesenden Klammer ein Leerzeichen eingefügt ist.
also genau wie Deine Zeile 02. - die ist richtig.
Wieso hast Du nicht den Code Von meinem vorherigen Thread genommen?
Der war doch ok so?
(Da kam wohl Dein Ergeiz hinzu, um es selbst zu probieren)
Gruß Phil
hallo Alexander;
Thread - ich meine Doch Kommentar.
Wieviele Zeilen hat Deine pat.bdt?
Wirklich sieben?
Oder ist grerade die siebte Zeile leer bzw unter acht Zeichen lang?
Bitte Überprüfe das mal!
denn bei mir Funktioniert das script.
Thread - ich meine Doch Kommentar.
Wieviele Zeilen hat Deine pat.bdt?
Wirklich sieben?
Oder ist grerade die siebte Zeile leer bzw unter acht Zeichen lang?
Bitte Überprüfe das mal!
denn bei mir Funktioniert das script.
@echo on & setlocal enabledelayedexpansion
:anf
for %%i in (5 7 3) do call :read %%i
if not defined read (set read=1 & goto :anf )
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"
goto :eof
:read
set Nr=%1
if not defined read goto :readin
if %1 == 5 set "File=%File%!%Nr%:~7!" & goto :eof
if %1 == 7 set "File=%File%, !%Nr%:~7!" & goto :eof
if %1 == 3 set "File=%File%__!%Nr%:~7!" & goto :eof
:readin
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof