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-Key: 167190

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

Printed on: April 23, 2024 at 08:04 o'clock

Member: micneu
micneu May 30, 2011 at 13:06:37 (UTC)
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
Member: Snowman25
Snowman25 May 30, 2011 at 13:08:34 (UTC)
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
Member: Skyemugen
Skyemugen May 30, 2011 at 13:13:45 (UTC)
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é
Member: Mike-125
Mike-125 May 30, 2011 at 13:28:59 (UTC)
Goto Top
Hallo Michael,

Ja das ist richtig!
Member: Mike-125
Mike-125 May 30, 2011 at 13:30:51 (UTC)
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
Member: Snowman25
Snowman25 May 30, 2011 at 13:33:33 (UTC)
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
Member: Mike-125
Mike-125 May 30, 2011 at 13:34:18 (UTC)
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.
Member: Mike-125
Mike-125 May 30, 2011 at 13:44:28 (UTC)
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
Member: Snowman25
Snowman25 May 30, 2011 at 13:49:19 (UTC)
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.
Member: Friemler
Friemler May 30, 2011 at 13:57:16 (UTC)
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
Member: Mike-125
Mike-125 May 30, 2011 at 14:08:43 (UTC)
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
Member: Snowman25
Snowman25 May 30, 2011 at 14:18:41 (UTC)
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
	)
)
Member: Mike-125
Mike-125 May 30, 2011 at 14:57:59 (UTC)
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.....
Member: Snowman25
Snowman25 May 30, 2011 at 15:02:21 (UTC)
Goto Top
:doSomething
set line3=%*
ren n1234.pdf "n1234 %line3%.pdf"  
if NOT EXIST %line% md %line3%
move "n1234 %line3%.pdf" %line3%  
Member: bastla
bastla May 30, 2011 at 19:03:18 (UTC)
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
Member: Snowman25
Snowman25 May 31, 2011 at 07:35:45 (UTC)
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
Member: Mike-125
Mike-125 May 31, 2011 at 08:53:35 (UTC)
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
Member: Progfreund
Progfreund May 31, 2011 at 11:33:16 (UTC)
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
Member: Skyemugen
Skyemugen May 31, 2011 at 13:00:22 (UTC)
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
Member: bastla
bastla May 31, 2011 at 13:04:29 (UTC)
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
Member: Progfreund
Progfreund May 31, 2011 at 13:31:21 (UTC)
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
Member: Friemler
Friemler May 31, 2011 at 14:30:04 (UTC)
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]
Member: bastla
bastla May 31, 2011, updated at Oct 18, 2012 at 16:47:05 (UTC)
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]