alexander01
Goto Top

Batch Variable in Dateinamen umleiten

Hallo, ich habe eine Frage:

in einem batch-Script sollen die aus einer zweizeiligen Datei ausgelesenen und vorbereiteten Daten als Variablen in einem neu zu erstellenden Dateinamen erscheinen:

for /f "delims=" %%f in (c:\neu.bdt) do call : loop "%%f"
goto ende

:loop
set "Quelle=%~1"
set "Ziel=%Quelle:~7%"
goto :eof

ein @echo %Ziel% bringt mir eine (richtige) zweizeilige Ausgabe mit den richtigen Daten.
Baue ich %Ziel% in den dateinamen ein, wird nur die letzte Variable verwendet.
Es sollen aber beide Variablen unmittelbar nebeneinander im Dateinamen erscheinen.

Beispiel:

@echo %Ziel% ergibt:

Haus
Baum

start "word" "k:\%Ziel%.doc

es wird k:\Baum.doc geöffnet, es soll aber k:\HausBaum.doc geöffnet werden.

Ich wäre für Hilfe dankbar.

alexander

Content-Key: 117953

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Jun 10, 2009 at 19:03:32 (UTC)
Goto Top
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%f in (c:\neu.bdt) do call :loop "%%f"  
start "word" "k:\%Ziel%.doc  
goto :eof
:loop
set /a n+=1
set "Quelle%n%=%~1"  
set "Ziel=%Ziel%!Quelle%n%:~7!"  
goto :eof
Member: Biber
Biber Jun 10, 2009 at 19:15:24 (UTC)
Goto Top
Moin alexander01,

willkommen im Forum.
Der Denkfehler ist: das Innere des :loop-Blocks in Deinem Schnipsel wird bei jeder Zeile wieder neu ausgeführt.
Da nur die zuletzt gesetzte Variable %Ziel% nach Abarbeitung aller Zeilen "überlebt", ist das Ergebnis immer (egal ob Du 2 oder 2000 Zeilen liest) das Umformungsergebnis der letzten Zeile.

Es gibt mehrere mögliche Alternativstrategien:
  • explizit die erste und die letzte Zeile lesen (geht schief, wenn nur eine Zeile da ist)
  • explizit die Zeile #1 und die Zeile #2 lesen
  • oder aber zu sagen: egal, ob 2,3 oder 5 Zeilen: ALLE Zeilen sollen aneinandergekettet werden und davon halt die ersten 8 Zeichen sind der Name.

Ich wähle mal die Strategie a)
 @echo off & setlocal
::erste Zeile lesen
Set /p quelle=<c:\neu.bdt
::jetzt mit skip Zeile 1 überlesen
:: (und unterstellen, es gibt nur eine weitere Zeile!)
for /f "skip=1 delims=" %%f in (c:\neu.bdt) do set "Quelle=%quelle%%%f"  
set "Ziel=%Quelle:~7%"  
Start "whatever"  "k:\%Ziel%.doc"  
goto :eof
[ungetestet]

Grüße
Biber
Member: alexander01
alexander01 Jun 10, 2009 at 19:38:35 (UTC)
Goto Top
danke euch beiden!

Biber, die zweite Variante wäre mir die angenehmste! zwei (oder evtl. besser 3) definierte Zeilen sollten den Namen bilden.

Ich probiere gleich ...
danke

Grüße

alexander
Member: pieh-ejdsch
pieh-ejdsch Jun 10, 2009 at 23:08:16 (UTC)
Goto Top
ups hab grad nen SchusselFehler von mir gesehen
Zeile 08
set "Ziel=%Ziel%!Quelle%n%:~7!"

wird gleich gefixt
Member: alexander01
alexander01 Jun 11, 2009 at 19:03:56 (UTC)
Goto Top
Hallo,
ich habe jetzt auf der Basis eurer Informationen mein Script angepasst:
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%\orig.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" "k:\%fein%.doc"  
mit einer zweizeiligen Datei funktioniert alles gut!
Noch zwei Fragen habe ich:
ist die Datei 3 oder 4-zeilig, funktioniert es nicht mehr, es wird, wie weiter oben besprochen, nur die erste und die letzte Zeile in den Namen (%fein%) übernommen.
1. Könnte man das Script noch verfeinern, um eine 3. und eine 4. Zeile hinzuzufügen (das reicht dann auch)?
2. Wie "formatiert" man %fein%, das nicht "wort1wort2" entsteht sondern z.B. "wort1, wort2" ?

ich danke für Hilfe

Gruß
Alexander


^^[Edit Biber] Code in Code-Tags gesetzt. [/Edit]
Member: pieh-ejdsch
pieh-ejdsch Jun 11, 2009 at 19:45:32 (UTC)
Goto Top
Hallo Alexander
Hier nochmal eine Version um Dateien mit beliebiger Zeilenanzahl zu starten. öffnet also jedes Dokument nach auslesen jeder geraden Zeile.
Komma hinzugefügt
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%f in (c:\neu.bdt) do call :loop "%%f"  
goto :eof
:loop
if not defined part1 (set part1=1 & set /a n+=1) else set part1=
set "Quelle=%~1"  
if defined part1 set "Ziel%n%=%Quelle:~7%" else start "word" "k:\!Ziel%n%!,%Quelle:~7%.doc"   
goto :eof
achso und wenn Du das zweite Token in Deiner Forschleife
for /f "tokens=1,* delims=:" %%i in ......
nicht auswertest genügt doch Dieser Code
gleich für Deinen Code angepasst und entschlakt
@echo off & setlocal enabledelayedexpansion
for /f "delims=:" %%i in ('findstr /n $ %vz%\orig.bdt') do (for /L %%a in (6,2,8) do if %%i==%%a call :loop "%%i")  
goto :eof
:loop
if not defined part1 (set part1=1 & set /a n+=1) else set part1=
set "Quelle=%~1"  
if defined part1 set "Ziel%n%=%Quelle:~7%" else start "word" "k:\!Ziel%n%!,%Quelle:~7%.doc"   
goto :eof

so... - Schusselfehler entfernt
nochn Fehler entfernt - man ich brauchn Batchprüftool - oder mach selbst eins...
Version 2.1b durch Version 2.2 ersetzt
Member: alexander01
alexander01 Jun 13, 2009 at 08:08:56 (UTC)
Goto Top
funktioniert bei mir nicht, habe "pause" eingebaut, trotzdem wird nichts angezeigt, der das Fenster wird sofort geschlossen.
gruß
Alexander
Member: pieh-ejdsch
pieh-ejdsch Jun 13, 2009 at 11:26:46 (UTC)
Goto Top
Wie ist denn Deine orig.bdt aufgebaut?
es soll ja nur die 6. und 8. Zeile verwendet werden.
Wird vz gesetzt?
Ich hab ja Deine Batch net komplett bzw ohne
Set vz=....

Nimm die CMD und ersetze
@echo off & setlocal enabledelayedexpansion
mit
@echo ON & setlocal enabledelayedexpansion
abspeichern
Wintaste+R
cmd
und Enter
dann ziehst Du Deinen Batch rein
und Enter