Top-Themen

Aktuelle Themen (A bis Z)

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)

Mitglied: Hesperus

Hesperus (Level 1) - Jetzt verbinden

22.11.2007, aktualisiert 23.11.2007, 8834 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 ..
Ähnliche Inhalte
Batch & Shell

Batch zum Auslesen einer .txt Datei in Variablen

Frage von DanielG80Batch & Shell2 Kommentare

Hallo, habe das Forum durchforstet und leider nichts passendes gefunden! Ich habe eine Txt datei vorliegen mit folgendem Inhalt: ...

Batch & Shell

Batch - Bestimmter Inhalt einer Zeile aus einer txt oder ini als Variable

gelöst Frage von element22Batch & Shell2 Kommentare

Hallo zusammen, leider finde ich den Fehler nicht. Na gut, vielleicht sitzt er vorm Monitor, aber das ist etwas ...

PHP

TXT Datei auslesen und bestimmte Zeilen in Variable setzen

gelöst Frage von 126594PHP11 Kommentare

Hallo zusammen, vorweg muss ich sagen, ich bin (bis jetzt) absoluter Neuling was PHP angeht. Ich will aus einer ...

Batch & Shell

Batch: mehrere Zeilen (Blöcke) in einer txt Datei zu einer Variablen hinzufügen

Frage von pukassBatch & Shell9 Kommentare

Guten Abend zusammen! Bin neu hier und habe hier im Forum gesehen, dass sich einige gut in der batch ...

Neue Wissensbeiträge
Peripheriegeräte
Unterschrank für HP Drucker
Tipp von NixVerstehen vor 2 TagenPeripheriegeräte3 Kommentare

Als kurzen Freitags-Tipp möchte ich gerne meinen neuen Drucker-Unterschrank Modell Amica KS 15423W vorstellen. Das Gerät eignet sich hervorragend ...

Windows 10
Windows 10 - Probleme mit Point-And-Print
Tipp von emeriks vor 3 TagenWindows 103 Kommentare

Hi, wir kämpfen z.Z. mit einigen Druckertreibern, welche unter Win10 beim Verbinden eines Druckers von Printserver mit dem Dialog ...

Windows 10

Windows 10 1803 - Ihr Roamingbenutzerprofil wurde nicht vollständig synchronisiert

Anleitung von Deepsys vor 3 TagenWindows 101 Kommentar

Bei allen Windows 10 1803 PCs traten Probleme mit den Servergespeicherten Profilen auf. Das Abmelden dauerte sehr lange und ...

Exchange Server
Exchange - Fehler mit 2018-07 Sicherheitsupdate
Tipp von ArnoNymous vor 5 TagenExchange Server7 Kommentare

Hallo, es gibt mal wieder Freude mit den MS-Updates. KB4338814 führt dazu, dass der Exchange keine Mails mehr zustellt. ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
HP Probook 470 G4 - abbrechende Downloads
Frage von joern1LAN, WAN, Wireless19 Kommentare

Folgendes Problem, für einen Tipp wäre ich dankbar: Bei WLAN-Verbindung zum Internet (nicht LAN) kommt es bei etwas größeren ...

Server-Hardware
DL380p Gen8 LEDs Laufwerksaktivität funktionieren nicht
Frage von Cisco7971Server-Hardware17 Kommentare

Hallo zusammen, ich habe hier ein seltsames Problem: Die LEDs an den Smart Carriern, die bei Laufwerksaktivität rotieren, tun ...

Server-Hardware
Einsteigerfragen zu HP ProLiant DL380p Gen 8
gelöst Frage von brain2011Server-Hardware15 Kommentare

Hallo, ich habe mir einen HP ProLiant DL380p Gen 8 zugelegt, um mich grundlegend mit dieser Geräteklasse und der ...

Windows Server
Leistungsindikatoren WS2012R2
Frage von Der.ITlerWindows Server11 Kommentare

Hallo Gemeinde, seit gestern habe ich auf zwei von meinem 8 Hardwareservern folgendes Problem, dass die Leistungsindikatoren nicht gestartet ...