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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 167190
Url: https://administrator.de/contentid/167190
Ausgedruckt am: 05.11.2024 um 14:11 Uhr
23 Kommentare
Neuester Kommentar
Hallo @Mike-125,
mit folgendem Skript kannst du die dritte Zeile auslesen:
Im
Gruß
Snow
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
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é
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é
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
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
Zitat von @Mike-125:
Leider funktioniert der Batch nicht, macht nur das Fenster kurz auch und schliesst es nach ca. einer halben Sekunde wieder.
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.
Hallo Mike-125,
sollte so gehen (ungetestet):
Ich habe mal angenommen, dass die DLL- und die PDF-Dateien sich im gleichen Verzeichnis befinden.
Durch den
Gruß
Friemler
PS:
Wenn es nicht funktioniert:
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:
@echo off
raus- Script aus einem Konsolenfenster starten und Scriptlauf verfolgen
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:Es generiert mir das File, aber ich erhalte anstatt das Datum die 4. Zeile......
for /F "skip=2 delims=" %%a in ('type %file%') do (
@set count+=1
if !count! EQU 1 (
call :doSomething %%a
)
)
@snow
Nur, um festzustellen, dass die gesuchte Zeile bereits verarbeitet wurde, brauchst Du aber nicht "
Grüße
bastla
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
bastla
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
Gruß
Snow
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
Gruß
Snow
@Friemler:
Ich habe noch Fragen zum Code:
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?
Kannst du mir die Verwendung der erweiterten Variablen in diesem Beispiel beschreiben?
Woher kommt die Variable %%l bzw. wieviele Variablen werden hier erzeugt?
LG
Ich habe noch Fragen zum Code:
for /f "tokens=1* delims=:" %%k in ('findstr /n "^" "%%f"') do (
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"
Woher kommt die Variable %%l bzw. wieviele Variablen werden hier erzeugt?
LG
Aloha,
Hinweise zum Ablauf und der Zeichen findest du unter
Hinweise dazu findest du am Ende der
greetz André
edit: @bastla, schön brav hinten anstellen, bitte *fg*
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
3
übereinstimmt (man könnte auch die Zeilenzahl per findstr
direkt suchen ohne if equ
), wird diese ausgegebenHinweise 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*
Hallo Progfreund!
Ich dräng' mich mal kurz vor [Edit] (Friemler rein) [/Edit] ...
Das Symbol für das Zeilenende wäre übrigens "$".
"
Grüße
bastla
Ich dräng' mich mal kurz vor [Edit] (Friemler rein) [/Edit] ...
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 ZeilennummerGrüße
bastla
Danke, Skyemugen und bastla.
Das Tutorial zur FOR-Schleife hat mir gut geholfen.
Der Buchstabe N hinter der erweiterten Variable hat mich etwas überrascht.
Das Tutorial zur FOR-Schleife hat mir gut geholfen.
Der Buchstabe N hinter der erweiterten Variable hat mich etwas überrascht.
Hallo Progfreund,
die Fragen beantworte ich Dir gerne. Solche Nachfragen kommen leider viel zu selten.
Zur ersten Frage:
Durch
BTW: Am Anfang von Zeilen steht kein
Zur zweiten Frage:
Die Variable
Gruß
Friemler
[EDIT]
Da war der bastla wieder schneller, bzw. ich habe vorhin zu wenig gescrollt
[/EDIT]
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.
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
[/EDIT]
[OT]
@Friemler
Grüße
bastla
[/OT]
@Friemler
Da war der bastla wieder schneller,
Nicht schnell genug ... bzw. ich habe vorhin zu wenig gescrollt
Immer noch nicht weit genug ...Grüße
bastla
[/OT]