mike-125
Goto Top

Batch .txt file 3. Zeile kopieren und Ordner damit benennen

Hallo,

Ich bin mit meinem Latein von der Dossprache am Ende unf finde einfach die pasende Lösung nicht!

Ich habe ein File namens 1234.dll, in dieser befindet sicht auf der 3. Zeile das Datum. Zugleich habe ich ein .pdf File mit dem Namen n1234.pdf und diese sollte das Datum von der im vorhanden .dll File haben!

Ex: N1234 21.2.2010.pdf

Kann mir da jemand weiterhelfen ?

PS: im .dll File sieht so aus:
1. Zeile: 1234
2. Zeile: ist leer
3. Zeile: Datum
4. Zeile: Test

Vielen Dank und liebe Grüsse

Content-ID: 167190

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

Ausgedruckt am: 26.11.2024 um 00:11 Uhr

micneu
micneu 30.05.2011 um 15:06:37 Uhr
Goto Top
also verstehe ich es richtig das du eine datei "1234.dll" hat mit dem inhalt:
1. Zeile: 1234
2. Zeile: ist leer
3. Zeile: Datum
4. Zeile: Test

und eine pdf-datei mit dem namen "n1234.pdf "

und als ergebnis willst du den dateinamen (großgeschrieben+datum)

gruß michael
Snowman25
Snowman25 30.05.2011 um 15:08:34 Uhr
Goto Top
Hallo @Mike-125,

mit folgendem Skript kannst du die dritte Zeile auslesen:
rem @Echo off
set file=1234.dll

setlocal enabledelayedexpansion
set count=0
for /F "delims=" %%a in (%file%) do (  
	@set /a count+=1
	if !count! EQU 3 (
		call :doSomething %%a
	)
)
endlocal

goto :eof

:doSomething
set line3=%*

goto :eof
:eof

Im :doSomething-Bereich musst du noch deinen eigentlichen Verwendungszweck einfügen. Der war mir aus deiner Frage nicht ganz ersichtlich.

Gruß
Snow
Skyemugen
Skyemugen 30.05.2011 um 15:13:45 Uhr
Goto Top
Aloha,

warum nur glaube ich, dass du ein ganzes Verzeichnis voller .dll und den dazugehörigen .PDF-Dateien hast? Für eine Datei macht man ja sicherlich nicht diesen Umstand ...

Wenn ich es also unter den (möglichen) Umständen betrachte, willst du aus jeder .dll das Datum auslesen und die dazugehörige .PDF jeweils umbenennen?

greetz André
Mike-125
Mike-125 30.05.2011 um 15:28:59 Uhr
Goto Top
Hallo Michael,

Ja das ist richtig!
Mike-125
Mike-125 30.05.2011 um 15:30:51 Uhr
Goto Top
Ich würde gerne das "Datum", welches in der 3. Zeile in der .dll befindet zum Namen der vorhandenen .pdf file hinzufügen.
Example: n1234 21.05.2011.pdf
Snowman25
Snowman25 30.05.2011 um 15:33:33 Uhr
Goto Top
Zitat von @Mike-125:
Ich würde gerne das "Datum", welches in der 3. Zeile in der .dll befindet zum Namen der vorhandenen .pdf file
hinzufügen.
Example: n1234 21.05.2011.pdf
:doSomething
set line3=%*
ren n1234.pdf "n1234 %line3%.pdf"  

goto :eof
Mike-125
Mike-125 30.05.2011 um 15:34:18 Uhr
Goto Top
Hallo André,

Erhalte jeden Tag 5 .dll Files mit dem gleichen Ihnalt (ausser von der 1. Zeile). Dies ist ein Output von einem anderen Prg, welches die Pdf Files generiert.
Leider erhalte ich bei der generierung von den Pdf Files nur die Nummer und ohne Datum. Das Datum ist "leider" im .dll File vorhanden. Somit kann ich die Pdf Files besser archivieren, da sie das Datum zusätzlich zum Namen haben.
Mike-125
Mike-125 30.05.2011 um 15:44:28 Uhr
Goto Top
Leider funktioniert der Batch nicht, macht nur das Fenster kurz auch und schliesst es nach ca. einer halben Sekunde wieder.
-> mach aber nix.....

rem @echo off
set file=1234.dll

setlocal enabledelayedexpansion
set count=0
for /F "delims=" %%a in (%file%) do (
@set /a count+=1
if !count! EQU 3 (
call :doSomething %%a
)
)
endlocal

goto :eof


:doSomething
set line3=%*
ren n1234.pdf "n1234 %line3%.pdf"


goto :eof
:eof
Snowman25
Snowman25 30.05.2011 um 15:49:19 Uhr
Goto Top
Zitat von @Mike-125:
Leider funktioniert der Batch nicht, macht nur das Fenster kurz auch und schliesst es nach ca. einer halben Sekunde wieder.

[_] Du führst die Batch im richtigen Ordner aus (der, in dem sich auch die .dll und .pdf-Dateien befinden)
[_] Du hast die Dateinamen entsprechend angepasst
[_] Du hast das Skript von der Eingabeaufforderung aus gestartet, um eventuelle Fehlermeldungen zu lesen
[_] Du hast einen pause-Befehl ans Ende gehängt, um Fehlermeödungen zu lesen.
Friemler
Friemler 30.05.2011 um 15:57:16 Uhr
Goto Top
Hallo Mike-125,

sollte so gehen (ungetestet):
@echo off

setlocal


set "SrcDir=DasVerzeichnis"  


for %%f in ("%SrcDir%\*.dll") do (  
  for /f "tokens=1* delims=:" %%k in ('findstr /n "^" "%%f"') do (  
    if %%k equ 3 (
      echo ren "%%~dpfN%%~nf.pdf" "N%%~nf %%l.pdf"  
    ) 
  )
)

exit /b

Ich habe mal angenommen, dass die DLL- und die PDF-Dateien sich im gleichen Verzeichnis befinden.

Durch den ECHO-Befehl in Zeile 12 wird nur ausgegeben, was passieren würde.

Gruß
Friemler


PS:
Wenn es nicht funktioniert:
  1. @echo off raus
  2. Script aus einem Konsolenfenster starten und Scriptlauf verfolgen
Mike-125
Mike-125 30.05.2011 um 16:08:43 Uhr
Goto Top
Hallo Snowman25,

Vielen Dank für Deine Hilfe!!!!

Ich komme langsam auf den Weg!!!

Es generiert mir das File, aber ich erhalte anstatt das Datum die 4. Zeile......

Mann man die 3. Zeile nch fixieren ?

Gruss

Mike
Snowman25
Snowman25 30.05.2011 um 16:18:41 Uhr
Goto Top
Zitat von @Mike-125:
Es generiert mir das File, aber ich erhalte anstatt das Datum die 4. Zeile......
Sorry. Hatte die Leerzeile vergessen. Tausche den For-Block gegen diesen aus:
for /F "skip=2 delims=" %%a in ('type %file%') do (  
	@set count+=1
	if !count! EQU 1 (
		call :doSomething %%a
	)
)
Mike-125
Mike-125 30.05.2011 um 16:57:59 Uhr
Goto Top
Perfekt, funktioniert...!
Ganz herzlichen Dank Snowman....

Jetzt versuche ich noch den Ordner, welche ich auch mit diesem Datum eröffnen konnte, die Dateien zu verschieben......!

Bis jetzt findet er den Ordner nicht, wenn ich mit move %line2% arbeite.....
Snowman25
Snowman25 30.05.2011 um 17:02:21 Uhr
Goto Top
:doSomething
set line3=%*
ren n1234.pdf "n1234 %line3%.pdf"  
if NOT EXIST %line% md %line3%
move "n1234 %line3%.pdf" %line3%  
bastla
bastla 30.05.2011 um 21:03:18 Uhr
Goto Top
@snow
Nur, um festzustellen, dass die gesuchte Zeile bereits verarbeitet wurde, brauchst Du aber nicht "delayedexpansion" einzusetzen - das ließe sich auch etwa so bewerkstelligen:
rem @echo off
setlocal

set file=1234.dll

set "Zeile="  
for /f "usebackq skip=2 delims=" %%a in ("%file%") do if not defined "Zeile" (set "Zeile=%%a" & call :doSomething %%a)  
if defined Zeile echo %Zeile% wurde verarbeitet
goto :eof
Grüße
bastla
Snowman25
Snowman25 31.05.2011 um 09:35:45 Uhr
Goto Top
Hey @bastla,

Kennst das doch, wenn sich ein Skript aus einem Codebrei herausformt. Muss auch erst gereinigt und geschliffen werden.
Denn Schliff habe ich mir mal gespart face-wink

Gruß
Snow
Mike-125
Mike-125 31.05.2011 um 10:53:35 Uhr
Goto Top
Vielen Dank!

Der Batch läuft einwandfrei und wird morgen früh auf das produktiv System kopiert !!!

Nochmals vielen Dank für Eure Hilfe

Mike-125
Progfreund
Progfreund 31.05.2011 um 13:33:16 Uhr
Goto Top
@Friemler:
Ich habe noch Fragen zum Code:
for /f "tokens=1* delims=:" %%k in ('findstr /n "^" "%%f"') do (  
Sucht findstr das ^ Zeichen vor jeder Zeile einer Datei %%f und wenn das dritte ^ Zeichen gefunden ist, wird umbenannt?
Steht das ^ Zeichen für <LINEFEED> (Zeilenvorschub, ASCII-Code 10) am Anfang jeder Zeile und das <CARRIAGE RETURN> (Wagenrücklauf, ASCII-Code 13) am Ende jeder Zeile?

echo ren "%%~dpfN%%~nf.pdf" "N%%~nf %%l.pdf"  
Kannst du mir die Verwendung der erweiterten Variablen in diesem Beispiel beschreiben?
Woher kommt die Variable %%l bzw. wieviele Variablen werden hier erzeugt?

LG
Skyemugen
Skyemugen 31.05.2011 um 15:00:22 Uhr
Goto Top
Aloha,

  • findstr /n "^" "%%f" gibt die Zeilennummer jeder Trefferzeile in der aktuell zu durchsuchenden .dll-Datei aus und sucht dabei den Anfang der Zeile =>
    1:1234
    2: 
    3:Datum
    4:Test
wenn der Anfang der Zeile mit dem gesuchten 3 übereinstimmt (man könnte auch die Zeilenzahl per findstr direkt suchen ohne if equ), wird diese ausgegeben
Hinweise zum Ablauf und der Zeichen findest du unter findstr /?

  • echo ren "%%~dpfN%%~nf.pdf" "N%%~nf %%l.pdf" es wird eigentlich nur eine neue Variable erzeugt: %%l, denn %%f existiert ja bereits und wird genutzt (aus der ersten Schleife, der Hauptschleife)
%%l entstammt der zweiten Schleife, wie du sehen kannst, wurde dort der Doppelpunkt als Trennzeichen gesetzt, sodass die Variable %%k 3 enthält und alles nach dem Doppelpunkt der Variable %%l zugeschrieben wird, da der Buchstabe L nach K kommt, ist dies die nächstfolgende Variable des Tokens
%%~dpf ist Laufwerk, Pfad aus der Variable %%f, sprich aus der aktuell gelesenen .dll-Datei (das N ist einfach nur Text, der hintendran gesetzt wird - nach deiner Vorgabe) %%~nf ist nur der Dateiname (ohne Dateiendung)
Hinweise dazu findest du am Ende der for /?

greetz André

edit: @bastla, schön brav hinten anstellen, bitte *fg* face-wink
bastla
bastla 31.05.2011 um 15:04:29 Uhr
Goto Top
Hallo Progfreund!

Ich dräng' mich mal kurz vor [Edit] (Friemler rein) face-wink [/Edit] ... face-wink
Sucht findstr das ^ Zeichen vor jeder Zeile einer Date
Der Online-Hilfe solltest Du entnehmen können, dass "^" in diesem Fall einfach den Zeilenanfang symbolisier - und da jede Zeile einen solchen hat, und die Zielsetzung der Schleife ist, alle (auch leere) Zeilen zu erfassen, ist das der geignetste Suchbegriff.

Das Symbol für das Zeilenende wäre übrigens "$".
Kannst du mir die Verwendung der erweiterten Variablen in diesem Beispiel beschreiben?
"%%~dpf" liefert Laufwerk und Pfad der in "%%f" enthaltenen Datei (inkl abschließendem "\", woduch auch gleich das "N" am Beginn des Dateinamens hinzugefügt werden kann)
"%%~nf" enthält nur den Dateinamen (ohne Typ)
Woher kommt die Variable %%l bzw. wieviele Variablen werden hier erzeugt?
Da die Variablen der zweite Schleife ab "%%k" gebildet werden, stellt "%%l" das zweite (und wegen des "*" auch letzte) Token dar = den gesamten Zeileninhalt; in "%%k" steht die Zeilennummer

Grüße
bastla
Progfreund
Progfreund 31.05.2011 um 15:31:21 Uhr
Goto Top
Danke, Skyemugen und bastla.
Das Tutorial zur FOR-Schleife hat mir gut geholfen.
Der Buchstabe N hinter der erweiterten Variable hat mich etwas überrascht. face-smile
Friemler
Friemler 31.05.2011 um 16:30:04 Uhr
Goto Top
Hallo Progfreund,

die Fragen beantworte ich Dir gerne. Solche Nachfragen kommen leider viel zu selten.

Zur ersten Frage:
Durch "^" sucht FINDSTR nach allen Zeilen mit einem Zeilenanfang, findet also alle Zeilen. "^" ist ein regulärer Ausdruck zur Definition eines Suchmusters. Siehe auch FINDSTR /?. Die Implementierung von regulären Ausdrücken (oder Regular Expressions) in FINDSTR ist nicht ganz fehlerfrei.

BTW: Am Anfang von Zeilen steht kein <LineFeed>, nur am Ende in Kombination mit einem <CarriageReturn>


Zur zweiten Frage:
  • %%~dpf extrahiert aus dem Inhalt der Laufvariablen %%f das Laufwerk (d) und den Pfad (p).
  • %%~nf extrahiert aus dem Inhalt der Laufvariablen %%f den Dateinamen (n) ohne Extension.
Nebenbei werden bei diesen Ausdrücken auch noch evtl. umgebende Anführungszeichen entfernt. Siehe auch im Tutorial zur FOR-Schleife.

Die Variable %%l wird von der FOR-Schleife wegen tokens=1* automatisch erzeugt. Dieser Ausdruck bewirkt, dass die in der Befehlszeile angegebene Laufvariable %%k das erste Token enthält. Wegen dem * wird automatisch noch eine weitere Laufvariable erzeugt, die alles nach dem ersten Trennzeichen (wegen delims=: hier der Doppelpunkt) enthält. Diese automatisch erzeugten Laufvariablen (es können auch mehrere sein, bis zu 31, je nach dem was bei tokens= steht) erhalten alphabetisch aufsteigende Namen ausgehend vom Namen der in der Befehlszeile angegebenen Variablen. Hier ist das %%k, deshalb heißt die automatisch erzeugte Variable %%l. Siehe auch im Tutorial zur FOR-Schleife.

Gruß
Friemler


[EDIT]
Da war der bastla wieder schneller, bzw. ich habe vorhin zu wenig gescrollt face-wink
[/EDIT]
bastla
bastla 31.05.2011, aktualisiert am 18.10.2012 um 18:47:05 Uhr
Goto Top
[OT]
@Friemler
Da war der bastla wieder schneller,
Nicht schnell genug ... face-wink
bzw. ich habe vorhin zu wenig gescrollt face-wink
Immer noch nicht weit genug ...

Grüße
bastla
[/OT]