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, 8725 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
Mit freundlichen Grüßen
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

Mit freundlichen Grüßen
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.

Mit freundlichen Grüßen
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
Mit freundlichen Grüßen
Hesperus
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...