hesperus
Goto Top

per Batch, Zeilen eine TXT-Datei in Variable verwenden (mit Zählschleife)

Hallo zusammen,

nachdem ich mich nun seit längerem hier durchgelesen habe, kann, muss oder besser möche ich nun selber mal etwas fragen.

Mein Problem ist, dass ich eine Batch schreiben will, welche automatisch alle Dateien eines bestimmten Types in einem bestimmten Ordner, nach Änderungsdatum sortiert und in eine Textdatei speichert (neuste ganz oben). Soweit auch überhaupt kein Problem.
Aus dieser Datei sollen dann je nach eingetragenen Wert die erste bis max. sechste Zeile ausgelesen werden und an eine Variable übergeben werden. Dieser Wert (z.b. in Zeile 1 "test.pdf") soll dann, in dem Ordner, umbenannt werden und zur Schleife zurückkehren, den Zähler erhöhen und die 2te Zeile übergeben und dies solange bis der Zähler mit der vorher festgelegten Variable %Datmeng% übereinstimmt.

Da ich selber gerne mit Batch "spiele" und auch schon einige Beiträge hier gelesen habe, ist auch schon eine kleiner mehrzeiler daraus geworden.
Leider funktioniert er nicht so wie er soll. Ich weiß, das es ein Problem in der For-Schleife gibt in Bezug auf die Variable %cnt%.

den nachfolgenen Code habe ich aus einem anderen Beitrag hier aus dem Forum übernommen (bisher auch mit gutem Ergebniss face-wink ) aber leider nicht zu 100% verstanden. Ich würde mich freuen, wenn mir das jemand erklären könnte, da ich es gerne verstehen würde (Ich will ja was lernen).

Set /a "cnt=1"  
Set /a "n=1"  
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :setvarFixLine %n% "%%i"   

:setvarFixLine
If %cnt%==%1 Set "Var=%~2"  

Hier der vollständige Batch:

set Pfad=D:\Testumgebung\BackupStart\Daten
set Server=Infos
set Endung=pdf
set /a Datmeng=6

:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst
dir /o-d /b %Pfad%\%Server%\*.%Endung%>%Pfad%\%Server%\backupconfig.txt

{{comment_single_line_remark:1}}
:Start
Set /a {{comment_strings:13328275444}} 
Set /a "n=1"  
for /F {{comment_strings:13207134011}} %%i in (%Pfad%\%server%\backupconfig.txt) do call {{comment_single_line_double_colon:1}} %n% "%%i"   
Echo n-te Zeile, n=%n%: [%Var%]
goto Rname

{{comment_single_line_double_colon:1}}
If %cnt%==%1 Set "Var=%~2"  
set /a "cnt+=1"  
set /a "n+=1"  

{{comment_single_line_double_colon:2}}
{{comment_single_line_remark:2}}
echo [%Var%]
if exist %Pfad%\%Server%\Backup_%cnt%.%Endung% goto 1 else goto 2

:2
rename %Pfad%\%Server%\%Var% Backup_%cnt%.%Endung%
echo Umbenennung erfolgreich beendet
if %cnt% equ %Datmeng% goto eof else goto 3


:1
rename %Pfad%\%Server%\Backup_%cnt%.%Endung% Backup_renamed_%cnt%_%date%.%Endung%
goto Rname


:eof
exit

Ich hoffe und bin zuversichtlich, dass ihr meine Fehler findet und bin auch ehrlich gespannt was für welche das sind.
Achso zum Schluss: Ich möchte nur Batch verwenden, da ich denke, das dies möglich ist.

Vielen Dank schonmal
MfG
Hesperus

Content-Key: 74227

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

Printed on: April 16, 2024 at 11:04 o'clock

Member: miniversum
miniversum Nov 22, 2007 at 17:13:13 (UTC)
Goto Top
Wen ich Dich richtig verstanden habe sollten diese Änderungen bewirken was du willst:
set "Pfad=D:\Testumgebung\BackupStart\Daten"  
set "Server=Infos"  
set "Endung=pdf"  
set Datmeng=6

:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst
dir /o-d /b "%Pfad%\%Server%\*.%Endung%">"%Pfad%\%Server%\backupconfig.txt"  

:: n-te Zeile in %var% speichern; n ist im Beispiel 1
:Start
Set cnt=1
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :Rname "%%i"   
goto:eof

:Rname
set Var=%1
if %cnt% leq %Datmeng% (
  Echo n-te Zeile, cnt=%cnt%: [%Var%]

  ::Befehl zum automatischen Backup umbenennen
  echo [%Var%]
  if exist "%Pfad%\%Server%\Backup_%cnt%.%Endung%" (  
    rename "%Pfad%\%Server%\Backup_%cnt%.%Endung%" "Backup_renamed_%cnt%_%date%.%Endung%"  
  )

  rename "%Pfad%\%Server%\%Var%" "Backup_%cnt%.%Endung%"  
  echo Umbenennung erfolgreich beendet
  Set /a cnt=%cnt%+1
)
Als Erklärung:
Aus der Datei backupconfig.txt werden die Dateien nach einander ausgelesen und jeweils der Dateiname an :Rname übergeben. Dort wird, sollte der laufende Zähler %cnt% <= der Datenmenge sein, die Umbenennoperatinen in der Klammer durchgeführt, sonst einfach nur dir ganze klammer übersprungen. -> Es werden also nur die ersten Paar Dateien in der Liste verarbeitet, der Rest nicht.
Di eumbenennoperationen ansich habe ich ncith wesentlich verändert, nur etwas anders angeordnet um ein paar sprünge wegfallen zu lassen.
Die von dir Verwendete Sprungmarke 3 war überflüssig denke ich. Wofür %n% war kann ich dir auch ncith sagen, denn es wird ncith benötigt, jedenfalls wenn ich dich richtig verstanden habe was die Batch machen soll.

miniversum
Member: Hesperus
Hesperus Nov 23, 2007 at 07:18:49 (UTC)
Goto Top
Hallo miniversum,

erst einmal vielen Dank für die schnelle Hilfe. Ich konnte es leider erst jetzt ausprobieren.
Deine Änderungen funktionieren sehr gut. Es gab/gibt zwar noch ein Problem aber das resultierte aus einem Denkfehler meinerseits.

Zur Erklärung: Wenn das Batch einen Ordner ausliest der z.B. gestern geändert wurde und seit dem nichts neues dazugekommen ist, würde er in die Backupconfig.txt die Einträge (je nach gesetzter %Datmeng%) [Backup_1.xxx, Backup_2.xxx, Backup_3.xxx, Test.xxx, ...) setzen.
Nach meiner Schleife würde das batch jetzt bemerken, dass eine Backup_1.xxx vorhanden ist und diese in Backup_renamed_usw. umbenennen um dann zu versuchen die erste Datei in der Liste (war ja in diesem Fall die Backup_1.xxx war) in Backup_1.xxx umzubenennen. Geht natürlich nicht, da zu diesem Zeitpunkt keine Datei mit diesem Namen mehr in Ordner existiert.

So ich hoffe das war jetzt nicht zu verwirrend ausgedrückt. Hat etwas gedauert ehe ich meinen eigenen Fehler entdeckt habe.


Lösen, will ich das ganze jetzt so, dass überprüft wird ob an 1ter Stelle in der txt-datei "Backup_1.xxx" steht und wenn ja der Batch beendet wird.

if %Var%==Backup_%cnt%.%Endung% goto:eof

so ungefähr.

Zwei Fragen hätte ich dazu aber noch.

1. An welcher Stelle müsste ich diese Zeile platzieren, damit sie den gewünschten Effekt hat und die Datei nicht schon umbenannt wurde?

2. Könntest du mir mal die einzelnen Segmente der For-Schleife erklären. Ich weiß zwar wie sie funktioniert aber leider nicht was genau nun dieser Parameter "Tokens=*" bedeutet.

Noch einmal Vielen Dank
Hesperus

EDIT: Verwirrende Formulierung entfernt. face-wink
Member: miniversum
miniversum Nov 23, 2007 at 12:53:33 (UTC)
Goto Top
Tut mir leid aber ichverstehe die Problematik nicht ganz. Kannst du denmal ein konkretes beispielmachen was passieren wollte udn was wirklich Passiert?

Tokens gibt an welche Elemente der Zeile die For gerate verarbeitet benutzt werden. Im prinzip könntest dudie auch weglassen hier. Wenn dus genau wissen wilslt gib mal am cmd
For /?
ein. Dort ist es eigentlich gut erklärt und auch Beispiele zu finden.

miniversum
Member: Hesperus
Hesperus Nov 23, 2007 at 13:26:34 (UTC)
Goto Top
Sorry, ich habe wirklich sehr verwirrend geschrieben.

Ich denke um das Problem zu verstehen, muss man es im Zusammenhang mit dem Zweck sehen.

Ich verwende zur Sicherung von Dateien NT-Backup. Im moment werden diese Sicherungsdateien jeden Tag, mit einem neuen Namen, neu erstellt. Die alten Sicherungsdateien bleiben in dem selben Ordner. Daher muß ich jeden Tag die zu sichernden Dateien per Hand auswählen.
Ich möchte nun in jeden Ordner den ich sichern will eine oder mehrere Dateien mit dem Namen Backup_nr.xxx haben welche von NT-Backup automatisch gesichert werden sollen.
Daher möchte ich ein Programm schreiben, welches in jeden von mir definierten Ordner die neusten Dateien umbenennt und die bereits vorhandenen als alt markiert (in dem Falle als "Backup_renamed_%date%_nr_.xxx".

Ist vielleicht nicht die schönste Lösung aber sicherlich machbar.

Mein Fehler den ich oben gemeint hatte, ist halt dass bestimmte Sicherungsdateien nur sporadisch neu erstellt werden, so das wenn der Batch das nächste mal läuft sie immer noch die aktuellste im Ordner ist. Und da tritt dann halt das ein was ich oben geschrieben habe.
Der Batch erkennt, dass eine Datei mit dem Namen Backup_nr.xxx vorhanden ist benennt sie um damit er die aktuellste so nennen kann und findet die aktuellste dann nicht mehr, da diese ja gerade umbenannt wurde. Daher müsste ich halt eine Zeile einfügen wo überprüft wird ob die aktuellste Datei in einem Ordner die Backup_nr.xxx ist und wenn ja den Umbenennvorgang stoppen da sie sonst nicht mehr gesichert wird.

So ich hoffe das war verständlicher

Noch einmal vielen Dank für die Hilfe sowie die Erklärung und sorry wenn ich teilweise ein bissl nerve

MfG
Hesperus
Member: miniversum
miniversum Nov 23, 2007 at 14:07:29 (UTC)
Goto Top
Warum verschiebst du nicht grundsätzlich alle Dateien in einen Neuen Ordner mit Datum und machst dann das backup? nach dem verschieben ist der Ordner immer leer, die alten Dateien sind in nem unterordner oder wo anders halt mit Datum und die aktuellen Dateien sind da.
Oder steh ich jetzt aufm Schlauch?

Sonst würd ich die Zeile so einfügen:
set "Pfad=D:\Testumgebung\BackupStart\Daten"  
set "Server=Infos"  
set "Endung=pdf"  
set Datmeng=6

:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst
dir /o-d /b "%Pfad%\%Server%\*.%Endung%">"%Pfad%\%Server%\backupconfig.txt"  

:: n-te Zeile in %var% speichern; n ist im Beispiel 1
:Start
Set cnt=1
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :Rname "%%i"   
goto:eof

:Rname
set Var=%1
if %Var%==Backup_%cnt%.%Endung% goto:eof
if %cnt% leq %Datmeng% (
  Echo n-te Zeile, cnt=%cnt%: [%Var%]

  ::Befehl zum automatischen Backup umbenennen
  echo [%Var%]
  if exist "%Pfad%\%Server%\Backup_%cnt%.%Endung%" (  
    rename "%Pfad%\%Server%\Backup_%cnt%.%Endung%" "Backup_renamed_%cnt%_%date%.%Endung%"  
  )

  rename "%Pfad%\%Server%\%Var%" "Backup_%cnt%.%Endung%"  
  echo Umbenennung erfolgreich beendet
  Set /a cnt=%cnt%+1
)
Member: Hesperus
Hesperus Nov 23, 2007 at 14:23:44 (UTC)
Goto Top
Hallo,

nein du stehst nicht auf dem Schlauch. Prinzipiell hätte ich es auch so gemacht ABER erstens ist das nicht allein meine Entscheidung und zweitens wären das mehrere hundert GB. Da dauert mir ehrlich gesagt das kopieren bzw. verschieben zu lange. face-smile

Wie gesagt noch einmal vielen Dank, ich probier es dann direkt mal aus und freu mich wieder ein wenig dazugelernt zu haben.

MfG
Hesperus
Member: miniversum
miniversum Nov 23, 2007 at 15:09:40 (UTC)
Goto Top
Beim Kopieren gebe ich dir recht. Ein verschieben dauert allerdingt wesentlich kürzer solange es noch innerhalb der gleichen Festplatte/Partition ist.

Funktioniert den der ansatz so?
Member: Hesperus
Hesperus Nov 23, 2007 at 18:33:54 (UTC)
Goto Top
Hallo Miniversum,

jep der die Position war perfekt. Jetzt funktioniert das komplette Programm so wie ich es mir vorgestellt habe.

Hab nocheinmal vielen Dank

schönes Wochenende
MfG
Hesperus