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

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

Frage Entwicklung Batch & Shell

Mitglied: Hesperus

Hesperus (Level 1) - Jetzt verbinden

22.11.2007, aktualisiert 23.11.2007, 8749 Aufrufe, 8 Kommentare

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 ) 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).

01.
Set /a "cnt=1" 
02.
Set /a "n=1" 
03.
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :setvarFixLine %n% "%%i"  
04.
 
05.
:setvarFixLine 
06.
If %cnt%==%1 Set "Var=%~2" 
07.
 
Hier der vollständige Batch:

01.
set Pfad=D:\Testumgebung\BackupStart\Daten 
02.
set Server=Infos 
03.
set Endung=pdf 
04.
set /a Datmeng=6 
05.
 
06.
:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst 
07.
dir /o-d /b %Pfad%\%Server%\*.%Endung%>%Pfad%\%Server%\backupconfig.txt 
08.
 
09.
:: n-te Zeile in %var% speichern; n ist im Beispiel 1 
10.
:Start 
11.
Set /a "cnt=1" 
12.
Set /a "n=1" 
13.
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :setvarFixLine %n% "%%i"  
14.
Echo n-te Zeile, n=%n%: [%Var%] 
15.
goto Rname 
16.
 
17.
:setvarFixLine 
18.
If %cnt%==%1 Set "Var=%~2" 
19.
set /a "cnt+=1" 
20.
set /a "n+=1" 
21.
 
22.
:Rname 
23.
::Befehl zum automatischen Backup umbenennen 
24.
echo [%Var%] 
25.
if exist %Pfad%\%Server%\Backup_%cnt%.%Endung% goto 1 else goto 2 
26.
 
27.
:2 
28.
rename %Pfad%\%Server%\%Var% Backup_%cnt%.%Endung% 
29.
echo Umbenennung erfolgreich beendet 
30.
if %cnt% equ %Datmeng% goto eof else goto 3 
31.
 
32.
 
33.
:1 
34.
rename %Pfad%\%Server%\Backup_%cnt%.%Endung% Backup_renamed_%cnt%_%date%.%Endung% 
35.
goto Rname 
36.
 
37.
 
38.
:eof 
39.
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
Mitglied: miniversum
22.11.2007 um 18:13 Uhr
Wen ich Dich richtig verstanden habe sollten diese Änderungen bewirken was du willst:
01.
set "Pfad=D:\Testumgebung\BackupStart\Daten" 
02.
set "Server=Infos" 
03.
set "Endung=pdf" 
04.
set Datmeng=6 
05.
 
06.
:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst 
07.
dir /o-d /b "%Pfad%\%Server%\*.%Endung%">"%Pfad%\%Server%\backupconfig.txt" 
08.
 
09.
:: n-te Zeile in %var% speichern; n ist im Beispiel 1 
10.
:Start 
11.
Set cnt=1 
12.
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :Rname "%%i"  
13.
goto:eof 
14.
 
15.
:Rname 
16.
set Var=%1 
17.
if %cnt% leq %Datmeng% ( 
18.
  Echo n-te Zeile, cnt=%cnt%: [%Var%] 
19.
 
20.
  ::Befehl zum automatischen Backup umbenennen 
21.
  echo [%Var%] 
22.
  if exist "%Pfad%\%Server%\Backup_%cnt%.%Endung%" ( 
23.
    rename "%Pfad%\%Server%\Backup_%cnt%.%Endung%" "Backup_renamed_%cnt%_%date%.%Endung%" 
24.
25.
 
26.
  rename "%Pfad%\%Server%\%Var%" "Backup_%cnt%.%Endung%" 
27.
  echo Umbenennung erfolgreich beendet 
28.
  Set /a cnt=%cnt%+1 
29.
)
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
Bitte warten ..
Mitglied: Hesperus
23.11.2007 um 08:18 Uhr
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.

01.
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.
Bitte warten ..
Mitglied: miniversum
23.11.2007 um 13:53 Uhr
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
Bitte warten ..
Mitglied: Hesperus
23.11.2007 um 14:26 Uhr
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
Bitte warten ..
Mitglied: miniversum
23.11.2007 um 15:07 Uhr
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:
01.
set "Pfad=D:\Testumgebung\BackupStart\Daten" 
02.
set "Server=Infos" 
03.
set "Endung=pdf" 
04.
set Datmeng=6 
05.
 
06.
:: Liste der zu verwendenden Dateien, sortiert, zuletzt geänderte zuerst 
07.
dir /o-d /b "%Pfad%\%Server%\*.%Endung%">"%Pfad%\%Server%\backupconfig.txt" 
08.
 
09.
:: n-te Zeile in %var% speichern; n ist im Beispiel 1 
10.
:Start 
11.
Set cnt=1 
12.
for /F "Tokens=*" %%i in (%Pfad%\%server%\backupconfig.txt) do call :Rname "%%i"  
13.
goto:eof 
14.
 
15.
:Rname 
16.
set Var=%1 
17.
if %Var%==Backup_%cnt%.%Endung% goto:eof 
18.
if %cnt% leq %Datmeng% ( 
19.
  Echo n-te Zeile, cnt=%cnt%: [%Var%] 
20.
 
21.
  ::Befehl zum automatischen Backup umbenennen 
22.
  echo [%Var%] 
23.
  if exist "%Pfad%\%Server%\Backup_%cnt%.%Endung%" ( 
24.
    rename "%Pfad%\%Server%\Backup_%cnt%.%Endung%" "Backup_renamed_%cnt%_%date%.%Endung%" 
25.
26.
 
27.
  rename "%Pfad%\%Server%\%Var%" "Backup_%cnt%.%Endung%" 
28.
  echo Umbenennung erfolgreich beendet 
29.
  Set /a cnt=%cnt%+1 
30.
)
Bitte warten ..
Mitglied: Hesperus
23.11.2007 um 15:23 Uhr
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.

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

MfG
Hesperus
Bitte warten ..
Mitglied: miniversum
23.11.2007 um 16:09 Uhr
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?
Bitte warten ..
Mitglied: Hesperus
23.11.2007 um 19:33 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Off Topic

"Ich habe nichts zu verbergen"

(2)

Erfahrungsbericht von FA-jka zum Thema Off Topic ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
CPU, RAM, Mainboards
Kaufberatung für mind. 8 verschiedene HighEnd-Mainboards (24)

Frage von yperiu zum Thema CPU, RAM, Mainboards ...

Mac OS X
Mac kann nicht im LAN pingen alle anderen schon (19)

Frage von smartino zum Thema Mac OS X ...

Hyper-V
Langsames Netzwerk i210 LAN Karte (10)

Frage von Akcent zum Thema Hyper-V ...

Netzwerke
Abisolierwerkzeug (10)

Frage von SarekHL zum Thema Netzwerke ...