alexander01
Goto Top

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

Content-ID: 118798

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

Ausgedruckt am: 26.11.2024 um 05:11 Uhr

pieh-ejdsch
pieh-ejdsch 23.06.2009 um 10:25:58 Uhr
Goto Top
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!


@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
alexander01
alexander01 23.06.2009 um 14:19:55 Uhr
Goto Top
Hallo, Phil

zuerst vielen Dank für Deine Mühe!

das Script will die Datei "...\%793eof" öffnen, dies mißlingt natürlich.

Die Zeilenfragmente werden offensichtlich nicht richtig übergeben.

Hast Du eine Idee?

Gruß

Alexander
pieh-ejdsch
pieh-ejdsch 23.06.2009 um 19:10:23 Uhr
Goto Top
so habs getestet müsste jetzt gehen

@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?
alexander01
alexander01 23.06.2009 um 21:25:54 Uhr
Goto Top
na mensch, SUPER !

Danke!

ein kleiner Schönheitsfehler: nach jedem Zeilenfragment folgt ein Leerzeichen:

"Z1 Z2 _Z3 _Z4 "


kann man daraus

"Z1Z2_Z3_Z4" machen?

aber ich bin glücklich auch so!

danke

Alexander
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 00:59:12 Uhr
Goto Top
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"

  • 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
alexander01
alexander01 24.06.2009 um 23:02:23 Uhr
Goto Top
Phil, danke für Deine Hilfe, es läuft!

Danke

Alexander
pieh-ejdsch
pieh-ejdsch 25.06.2009 um 17:58:46 Uhr
Goto Top
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
alexander01
alexander01 28.06.2009 um 20:51:13 Uhr
Goto Top
Hallo, Phil

meine Versuche, im Dateinamen ein Komma gefolgt von einem Leerzeeichen unterzubringen, scheitern.

@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  

nach dem ersten Zeilenfragment (=5) sollen ein Komma und ein Leerzeichen erscheinen, danach Fragment 2 (=7), gefolgt von "__" und danach Fragment3 (=3).

Setze ich statt des "," im obigen Beispiel irgendein anderes Zeichen ein, klappt es, es scheitert also am Komma.

Wer kann helfen?

Danke

Alexander
pieh-ejdsch
pieh-ejdsch 28.06.2009 um 23:49:38 Uhr
Goto Top
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.

@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
alexander01
alexander01 29.06.2009 um 23:17:23 Uhr
Goto Top
oh nein, Phil,

Entschuldigung!

Fehler in der Übernahme!

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)   

auch den Doppelpunkt vor "readin" gibt es.

so sieht es aus.

ich denke und hoffen, die schließende Klammer steht richtig am Ende.

das mit dem Komma muß eine andere Ursache haben.

Gruß

Alexander
pieh-ejdsch
pieh-ejdsch 30.06.2009 um 19:17:29 Uhr
Goto Top
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) face-wink

Gruß Phil
alexander01
alexander01 30.06.2009 um 23:03:43 Uhr
Goto Top
Hallo, Phil,

nein, das Script aus dem anderen Thread lief nicht, ich hatte pausen eingebaut, konnte den Fehler aber nicht eingrenzen..
die Syntax mit den Klammern habe ich beachtet, es stehen Leerzeichen drin. Trotzdem akzeptiert das Script das Komma nicht.

Gruß, Alexander
pieh-ejdsch
pieh-ejdsch 02.07.2009 um 22:15:26 Uhr
Goto Top
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.
@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  
alexander01
alexander01 03.07.2009 um 06:27:58 Uhr
Goto Top
Guten Morgen, Phil,

meine pat.bdt hat immer 23 Zeilen, in bestimmten Zeilen stehen bestimmte Angaben, aber in jeder zeile erst ab dem 8. Zeichen , davor stehen Zahlen.
Aus den Zeilen 5, 7 und 3 möchte ich wie oben gesagt, einen Dateinamen bauen "5, 7__3".
Ich prüfe nochmal genau die Syntax zwischen Deinem Script oben und meinem.

Danke

Alexander
pieh-ejdsch
pieh-ejdsch 03.07.2009 um 22:31:25 Uhr
Goto Top
hallo alexander,
Irgendwie ab ich da vorhin etwas falsch angegeben. (zeile sieben müsste - zeile acht heissen)

es werden natürlich die jeweils angegebenen Zeilen Übersprungen und die nächste zur Namensbildung genommen.

Gruß Phil
alexander01
alexander01 04.07.2009 um 13:07:56 Uhr
Goto Top
Hallo, Phil,

ich freue mich, ich habe den Fehler gefunden!

1. ich habe "echo on" laufen lassen (warum nicht früher??) und festgestellt, das der dateiname richtig gebildet wird
2. ich habe den letzten auszuführenden Befehl korrigiert:

von:
call explorer.exe /e,k:\............\%File%

auf:
call explorer.exe /e,"k:\............\%File%"

und: es läuft!

Danke nochmals für Deine viele Mühe und die Ideen!

Gruß
Alexander