Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: Mike-125

Mike-125 (Level 1) - Jetzt verbinden

30.05.2011, aktualisiert 18.10.2012, 5151 Aufrufe, 23 Kommentare

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
Mitglied: micneu
30.05.2011 um 15:06 Uhr
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
Bitte warten ..
Mitglied: Snowman25
30.05.2011 um 15:08 Uhr
Hallo Mike-125,

mit folgendem Skript kannst du die dritte Zeile auslesen:
01.
rem @Echo off 
02.
set file=1234.dll 
03.
 
04.
setlocal enabledelayedexpansion 
05.
set count=0 
06.
for /F "delims=" %%a in (%file%) do ( 
07.
	@set /a count+=1 
08.
	if !count! EQU 3 ( 
09.
		call :doSomething %%a 
10.
11.
12.
endlocal 
13.
 
14.
goto :eof 
15.
 
16.
:doSomething 
17.
set line3=%* 
18.
 
19.
goto :eof 
20.
:eof
Im :doSomething-Bereich musst du noch deinen eigentlichen Verwendungszweck einfügen. Der war mir aus deiner Frage nicht ganz ersichtlich.

Gruß
Snow
Bitte warten ..
Mitglied: Skyemugen
30.05.2011 um 15:13 Uhr
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é
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 15:28 Uhr
Hallo Michael,

Ja das ist richtig!
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 15:30 Uhr
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
Bitte warten ..
Mitglied: Snowman25
30.05.2011 um 15:33 Uhr
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
01.
:doSomething 
02.
set line3=%* 
03.
ren n1234.pdf "n1234 %line3%.pdf" 
04.
 
05.
goto :eof
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 15:34 Uhr
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.
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 15:44 Uhr
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
Bitte warten ..
Mitglied: Snowman25
30.05.2011 um 15:49 Uhr
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.
Bitte warten ..
Mitglied: Friemler
30.05.2011 um 15:57 Uhr
Hallo Mike-125,

sollte so gehen (ungetestet):
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcDir=DasVerzeichnis" 
07.
 
08.
 
09.
for %%f in ("%SrcDir%\*.dll") do ( 
10.
  for /f "tokens=1* delims=:" %%k in ('findstr /n "^" "%%f"') do ( 
11.
    if %%k equ 3 ( 
12.
      echo ren "%%~dpfN%%~nf.pdf" "N%%~nf %%l.pdf" 
13.
    )  
14.
15.
16.
 
17.
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
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 16:08 Uhr
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
Bitte warten ..
Mitglied: Snowman25
30.05.2011 um 16:18 Uhr
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:
01.
for /F "skip=2 delims=" %%a in ('type %file%') do ( 
02.
	@set count+=1 
03.
	if !count! EQU 1 ( 
04.
		call :doSomething %%a 
05.
06.
)
Bitte warten ..
Mitglied: Mike-125
30.05.2011 um 16:57 Uhr
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.....
Bitte warten ..
Mitglied: Snowman25
30.05.2011 um 17:02 Uhr
01.
:doSomething 
02.
set line3=%* 
03.
ren n1234.pdf "n1234 %line3%.pdf" 
04.
if NOT EXIST %line% md %line3% 
05.
move "n1234 %line3%.pdf" %line3%
Bitte warten ..
Mitglied: bastla
30.05.2011 um 21:03 Uhr
@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:
01.
rem @echo off 
02.
setlocal 
03.
 
04.
set file=1234.dll 
05.
 
06.
set "Zeile=" 
07.
for /f "usebackq skip=2 delims=" %%a in ("%file%") do if not defined "Zeile" (set "Zeile=%%a" & call :doSomething %%a) 
08.
if defined Zeile echo %Zeile% wurde verarbeitet 
09.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Snowman25
31.05.2011 um 09:35 Uhr
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
Bitte warten ..
Mitglied: Mike-125
31.05.2011 um 10:53 Uhr
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
Bitte warten ..
Mitglied: Progfreund
31.05.2011 um 13:33 Uhr
@Friemler:
Ich habe noch Fragen zum Code:
01.
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?

01.
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
Bitte warten ..
Mitglied: Skyemugen
31.05.2011 um 15:00 Uhr
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*
Bitte warten ..
Mitglied: bastla
31.05.2011 um 15:04 Uhr
Hallo Progfreund!

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 Zeilennummer

Grüße
bastla
Bitte warten ..
Mitglied: Progfreund
31.05.2011 um 15:31 Uhr
Danke, Skyemugen und bastla.
Das Tutorial zur FOR-Schleife hat mir gut geholfen.
Der Buchstabe N hinter der erweiterten Variable hat mich etwas überrascht.
Bitte warten ..
Mitglied: Friemler
31.05.2011 um 16:30 Uhr
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
[/EDIT]
Bitte warten ..
Mitglied: bastla
31.05.2011, aktualisiert 18.10.2012
[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]
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
Batch: Copy file.txt Lokaler Drucker (1)

Frage von fluluk zum Thema Windows 10 ...

Entwicklung
gelöst Get ip from external txt file and use in vbscript (5)

Frage von thankusomuch zum Thema Entwicklung ...

Batch & Shell
gelöst ( Batch ) Open File or Folder Dialog (5)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...