mick111
Goto Top

Variable innerhalb einer FOR Schleife ein 2. Mal nutzen

Hallo Leute, (ich habe diese Frage bereits in einem älteren Thread von mir eingefügt, aber bin mir jetzt nicht sicher, ob den noch Jemand sieht face-wink deshalb an dieser Stelle nochmal neu)

vielleicht könntet Ihr mir nochmal helfen.
Ich habe eine for Schleife, funktioniert auch soweit. Allerdings brauche ich eine Variable von dieser Schleife noch ein 2. Mal. Das müsste mit Setlocal doch gemacht werden, nur ich kriege das nicht auf die Reihe. Es geht um %%~a. Ich habe die in die Fehlerabfrage unten mal eingetragen, dort wo ich sie brauche.


for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y') do >>%Log% echo Kopiere %%~a ...& goto :eof2
:eof2

IF %Errorlevel% EQU 0 (
>>%Log% Echo %time% Backup %%~a erfolgreich kopiert
) Else (
>>%Log% Echo %time% Backup %%~a NICHT kopiert, Fehler %Errorlevel%
)

Danke Mick

Content-Key: 247284

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

Printed on: April 24, 2024 at 03:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Aug 23, 2014 updated at 17:37:08 (UTC)
Goto Top
Moin,

Suchfunktion hilft: Tutorial zur FOR-Schleife

lks

PS. eine eigenständdige frage stellt man nciht in alte Threads rein. sinnvoller wäre es einen Link zu dem Kontext anzugeben.

PPS: Klammern haben Ihren Sinn. face-smile
Member: rubberman
rubberman Aug 23, 2014 at 17:38:06 (UTC)
Goto Top
Hallo mick111,

das Problem ist komplexer als du denkst. Du willst sicherlich den Errorlevelwert des XCOPY Befehls prüfen, oder?
Falls ja, funktioniert das so nicht, da diese Kommandozeile innerhalb der FOR Schleife autark ausgeführt wird. Heißt, der Errorlevelwert kommt nicht im Batchprozess an.

Grüße
rubberman
Member: mick111
mick111 Aug 23, 2014 at 18:04:29 (UTC)
Goto Top
Hallo LKS,

ja eben, ich weiss, war falsch deshalb der Vermerk.

Ich bin nicht DER Scripter, deshalb komme ich ja nicht weiter.

Gruss
Mick
Member: Lochkartenstanzer
Lochkartenstanzer Aug 23, 2014 at 18:08:10 (UTC)
Goto Top
Zitat von @mick111:

Hallo LKS,

ja eben, ich weiss, war falsch deshalb der Vermerk.

Ich bin nicht DER Scripter, deshalb komme ich ja nicht weiter.



o.k. Dann mal so als Tipp:

  • Wenn Du in mehrere Befehlen auf die Zählvariable der For-schleife zu greifen willst, muß Du diese befehle Klammern, damit Du dann alle befehle in der Schreife ausführen kannst.

lks

PS: Und wie rubberman schon treffend sagte: Wenn Du den errorlevel von xcopy abfragen willst, ist deine Konstruktion falsch.

PPS: Einfacher wäre es vielleicht, uns einfach zu verraten, was Du erreichen willst.
Member: mick111
mick111 Aug 23, 2014 at 18:13:22 (UTC)
Goto Top
Hallo Rubberman,

Ja den Wert. Es sind mittlerweile um die 100GB zu kopieren und 1x auch über das Netz. Es war jetzt schon mal ein Fall, das es ein Prob. gab.
Ich wollte damit prüfen, ob das Kopieren klappte.
Also mit Übergabe des Variablenwertes %%~a auf eine andere Variable klappt nicht? Wie könnte man das sonst lösen?

Mick
Member: Nr60730
Nr60730 Aug 23, 2014 at 18:16:24 (UTC)
Goto Top
moin,,

code blöcke sind dir bekannt?


Set file=
for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y') do set "file=%%~a"  

>>%Log% echo Kopiere %%~a ...& goto :eof2
rem fehlt hier nicht was oder warum springts du mit goto eine Zeile tiefer
:eof2

IF %Errorlevel% EQU 0 (
>>%Log% Echo %time% Backup %file% erfolgreich kopiert
) Else (
>>%Log% Echo %time% Backup %file% NICHT kopiert, Fehler %Errorlevel%
)

Ein "erfolgreiches kopieren einer Datei (die irgendwas mit dem Namen Backup impliziert) sollte mittels checksumme oder ähnlichem überprüft werden, nicht via errorlevel (schon gar nicht aus einer schleife, denn der letzte zählt am Ende)
Member: Lochkartenstanzer
Lochkartenstanzer Aug 23, 2014 updated at 18:24:43 (UTC)
Goto Top
Zitat von @Nr60730:


rem fehlt hier nicht was oder warum springts du mit goto eine Zeile tiefer

Es wäre viel einfaher, wenn wir wüßten, was der TO eigentlich mit diesem Skripte genau erreichen will.

TO: sage es uns einafch natürlichsprachlich, was Der Sinn dieses Skriptes sein soll.

lks
Member: rubberman
rubberman Aug 23, 2014 at 18:26:54 (UTC)
Goto Top
Hallo mick111,

grundsätzlich stellt sich mir die Frage, warum du den Befehl in einer FOR /F Schleife ausführst. Ebenso gut kannst du StdOut und StdErr gleich in die Logdatei umleiten, á la
xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y >>%log% 2>&1  
Alles andere wäre extrem kompliziert und, wie schon erwähnt, wird die Errorlevel-Abfrage nicht funktionieren.

Grüße
rubberman
Member: Lochkartenstanzer
Lochkartenstanzer Aug 23, 2014 at 18:29:15 (UTC)
Goto Top
Zitat von @rubberman:

grundsätzlich stellt sich mir die Frage, warum du den Befehl in einer FOR /F Schleife ausführst.

Deswegen meine frage nach dem zweck der übung.

lks
Member: mick111
mick111 Aug 23, 2014 at 18:33:34 (UTC)
Goto Top
moment, ich muss erst mal sehen, wie das mit den Code Blöcken ist.
Dann kopiere ich mein ganzes Script mal

Mick
Member: mick111
mick111 Aug 23, 2014 at 18:56:37 (UTC)
Goto Top
Momentan habe ich noch viele Logs drin, ich bin noch am erstellen und so tue ich mich etwas leichter.
Aufgabe ist:
Es wird durch ein anderes Script ein Backup in QUELLE erstellt. Es ist gewünscht, dass die letzten 3 Backups auf dem Server verbleiben, sollen aber Täglich auch zusätzlich weg kopiert werden.
Dann habe ich noch eine Größenermittlung drin.
Zur Info: Die Backups sind aktuell 105 GB gross, haben unendlich viele Unterverzeichnisse und aktuell um die 350.000 Dateien.

Es funktioniert soweit schon, nur wollte ioch eben eine Überprüfung haben.

Gruss
Mick

REM @echo off
REM ******************** START Kopiert die aktuelle Sicherung auf 2 Ziele **************************
Set Quelle=D:\Vault_Backup
Set Ziel1=D:\Vault_Backup_Sammler
Set Ziel2=\\SERVER2\g\vm-vltprod
Set /a MaxDirs=3
Set /a counter=0

set LogFileDir=%Quelle%_Log
set LogFile=%~n0.log
set Log=%LogFileDir%\%LogFile%

>>%log% echo.
>>%log% echo.

>>%log% echo *X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*
>>%log% echo -----------------------------------------------------------------
>>%Log% Echo 1 Datum: %date% %time% Start Protokoll %LogFile% 
>>%log% echo -----------------------------------------------------------------
>>%log% echo.

REM >>%Log% Echo 2 Datum: %date% %time% %Ziel1%
REM for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel1%" /I /H /E /Y') do >>%log% echo Kopiere %%~a ... & REM goto :eof1  
REM :eof1
REM IF %Errorlevel% EQU 0 (
REM >>%Log% Echo %time% Datei %%~a erfolgreich kopiert
REM ) Else (
REM >>%Log% Echo %time% Datei %%~a NICHT kopiert, Fehler %Errorlevel%
REM )
REM>>%log% echo.
REM>>%log% echo ------------------------------------------------------
REM>>%log% echo.

>>%log% echo -----------------------------------------------------------------
>>%Log% Echo 3 Datum: %date% %time% Ziel2=%Ziel2%
>>%log% echo -----------------------------------------------------------------
for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y') do >>%Log% echo Kopiere %%~a ...& goto :eof2  
:eof2

IF %Errorlevel% EQU 0 (
>>%Log% Echo %time% Backup %%~a erfolgreich kopiert
 ) Else (
>>%Log% Echo %time% Backup %%~a NICHT kopiert, Fehler %Errorlevel%
 )


REM ******************** ENDE Kopiert die aktuelle Sicherung auf 2 Ziele  ***********************


REM **************************** START Erhalte max 3 Vault-Backups ******************************

>>%Log% echo.
>>%Log% echo.
>>%log% echo -----------------------------------------------------------------
>>%Log% Echo 4 Datum: %date% %time%
>>%log% echo -----------------------------------------------------------------
@echo :: ALTE SICHERUNGEN LOESCHEN 

for /f "delims=" %%i in ('dir /Ad /A-h /b /O-N "%Quelle%"') do call :loop "%%i"  
goto :eof

:loop
set /a counter=%Counter%+1 >>%Log%
if %counter% LEQ %MaxDirs% (echo %~1 ...%Counter% ^<^= %MaxDirs%....ok, kann bleiben ) >>%Log% & goto :eof

@echo BACKUP BEENDET!

REM **************************** Start Backupordnergröße auslesen *******************************

>>%log% echo.
set temp="%temp%\temp.vbs"  

echo WScript.Echo Round(Abs(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024/1024),4)>%temp%  
for /f %%i in ('cscript //nologo %temp% "%Quelle%\%~1"') do set Gr=%%i  
>>%LoG% echo Das Backup %Quelle%\%~1 ...  
>>%LoG% echo ... welches gelöscht wurde, war %Gr% GB gross.
del %temp%

REM **************************** Ende Backupordnergröße auslesen ********************************
rd /s /q "%Quelle%\%~1"  
REM goto :eof
REM **************************** ENDE Erhalte max 3 Vault-Backups *******************************
Member: rubberman
rubberman Aug 23, 2014 at 19:07:32 (UTC)
Goto Top
Zitat von @mick111:

... Backup ...
Mit XCOPY?? Womöglich nicht mal für dich privat sondern für einen Kunden?? Da bin ich definitiv raus. Ich hab auch kein Lagerfeuer im Wohnzimmer um die Bude warm zu bekommen. Für Backups gibt es vernünftige Software und wenn es schon Batch sein muss, dann zumindest ROBOCOPY.

Grüße
rubberman
Member: mick111
mick111 Aug 23, 2014 at 19:14:17 (UTC)
Goto Top
das ist für uns selbst. Es ist ein Dokumentenmanagement, mit dem ich meine/unsere Daten verwalte. Eigentlich alles, was an Papier rein kommt. Nix mehr Ordner mit Papier. Seit dem finde ich wieder was face-wink Also nix Kunde.
Das teil ist eine Client Server Lösung mit SQL, DB und Datenspeicher.... da geht es auch um Wiederherstellung, also nicht einfach so, extra Software zu Datensichern.
Gruss
Mick
Member: rubberman
rubberman Aug 23, 2014 updated at 19:19:53 (UTC)
Goto Top
ROBOCOPY ist nicht "extra Software". Ich kann dir nur dringend empfehlen, dich damit auseinander zu setzen, wenn es denn keine "extra Software" sein soll. Denn XCOPY ist auch für "uns" (alias Firma oder alias privat) ebenso wenig eine Alternative für Backups wie das oben erwähnte Lagerfeuer im Wohnzimmer zum Heizen der Wohnung.

Grüße
rubberman
Member: mick111
mick111 Aug 23, 2014 at 19:23:11 (UTC)
Goto Top
ich habe Dir eine PN geschickt face-wink
Member: Nr60730
Nr60730 Aug 24, 2014 at 09:11:56 (UTC)
Goto Top
Moin,

ganz ehrlich....

06. Set /a MaxDirs=3

Nehmen wir mal den nicht allzu theoretischen Fall an:

  • User x löscht was
  • Der nächste Tag ist ein Feiertag
  • der Tag danach ein "Brückentag", weil Wochenende
  • bemerkt wird das fehlen also max. (eher später) am Montag.(4 Tage nach dem löschen)

Das ist doch nicht wirklich durchdacht?

Du schreibst ein temp vbs um den Platz des Datensalats auszuwerten, nimmst das aber nicht als grundlage sicherung -1 tag war x gb groß ergo muß Sicherung heute mindestens x gb haben.

N8
Member: mick111
mick111 Aug 24, 2014 at 10:59:45 (UTC)
Goto Top
Hallo,

Du hast schon Recht. Nur was ist 100% sicher?
Wo die Sicherungen stattfinden, hat niemand Zugriff, höchstens der Admin.... USER face-wink
Die Daten werden auf dem Server nach jeder Sicherung mit Symantec vermutlich, noch nicht klar, gesichert. Aufgehoben auf dem Server 5 Tage.
Die Größe ermittle ich nur, um zu sehen, wie die Daten wachsen und weil es langsam mit diesen Datenmengen Grenzen gibt. Ich spekuliere auch mit VM, dann sichere ich die VM weg und gut ist.
Also du siehst, im Moment ist garnix klar.
Aber danke für Deine Überlegung.
Was würdest Du tun? Mich interessiert Deine Meinung und Deine Überlegungen.

Gruss
Mick
Member: Nr60730
Nr60730 Aug 24, 2014 at 11:17:08 (UTC)
Goto Top
Salve,

ich les da was von VM, du fragst wie ich es machen würde?

Ich überzeuge meinen Chef, das da "frickeln" nicht wirklich up2date ist und er mir bitte eine Lizenz für Veeam genehmigen sollte.

Da klicke ich dann an, wieviele Fullbackups, wieviele inkrementelle Sicherungen behalten werden und trage meine Backupadminadresse trage ich auch noch ein und freu mich über Mails/ Webseiten, die mir meinem Chef (und dem Revisor, der irgendwann mal vorbeikommt) eine standard konforme Lösung präsentieren zu können.

Und diese Zeilen sind von einem Admin, der gerne in x verschiedenen Sprachen scriptet.

Gruß
Member: mick111
mick111 Aug 24, 2014 at 11:44:59 (UTC)
Goto Top
Hi,

na ja, das Thema ist nicht so ganz einfach.

Wir sichern unsere VM´s mit Symantec. Der Server ist auch eine VM, ich sichere das Teil auch weg, ich hab schon eine Sicherung wenn es drauf ankommt.
Aaaber, wie gesagt, es ist nicht so ganz einfach.
Um die Datenbank und Filestore, um die es geht, ist Client Server. Es kommen pausenlos Daten hinzu, eigentlich, nimmt man es 100% ist eine Sicherung von gestern ein Ding der Unmöglichkeit. Warum mache ich dann den ###, wirst Du denken? Zeichnungsdaten von vorgestern, das Delta nicht mehr herstellbar.
Aber, es gibt etliche aber. Es sind zusätzlich noch andere wichtige Daten dabei. Nächstes Aber, brauche ich zugriff auf Daten, die nicht ... z. B. verlinkt sind, dann stelle ich diese Backups mit einen Fingerschnipp wieder her, oder auch auf einem anderen Server.... Fingerschnipp.. wie gesagt, wenn man die Software nicht kenn und die Thematik damit, ist das schwer vorstellbar, warum hinten durchs Knie.
Ich ziehe mal eine Linie und sage einfach mal, es gibt 2 Gruppen von Admins, die einen verwalten die gesamte Firma samt Niederlassungen und es gibt die CAD Admins. Sage ich zu einem Admin der ersten Gruppe, mach mal das CAD mit, zeigt der mir den Vogel und ich kann es verstehen...
Also, schwieriges Thema.
Grüße
Mick
Member: Nr60730
Nr60730 Aug 24, 2014 at 18:35:52 (UTC)
Goto Top
Salü,

Zitat von @mick111:
Ich ziehe mal eine Linie und sage einfach mal, es gibt 2 Gruppen von Admins, die einen verwalten die gesamte Firma samt
Niederlassungen und es gibt die CAD Admins. Sage ich zu einem Admin der ersten Gruppe, mach mal das CAD mit, zeigt der mir den Vogel und ich kann es verstehen...
Also, schwieriges Thema.
Grüße
Mick

Naja die aus der ersten Gruppe schreiben dir dann - "ist mir doch Wurstregal, ob da ein CAD oder eine Warenwirtschaft den SQL Server nutzt - der Serverdienst wird abends kurz gestoppt, ein dump der DB gezogen und ich bin auf der sicheren Seite"

Ich hab auch schon nette Erfahrungen mit offenen Dbs und Backupsoftware, die eigentlich speziell genau für Datenbanken / offenen Dateien Agenten hatte.

Egal Jacke wie Hose hat mit der Variablenbaustelle von hier ja nicht so viel zu tun.
Member: Xaero1982
Xaero1982 Aug 25, 2014 at 07:25:21 (UTC)
Goto Top
Moin,

benutze ein fast beliebiges Synctool. Da stellst du ein wann, wie oft (z.b. auch wenn eine neue Datei dazu kommt), wieviele Sicherungen etc.
Geht z.B. mit Puresync wunderbar.

Da bekommste dann wenn du willst auch ein Protokoll wenn was nicht klappte usw.

Das hier ist Gefrickel...

Gruß
Member: citroendsvier
citroendsvier Aug 26, 2014 at 08:10:00 (UTC)
Goto Top
Hallo,

wahrscheinlich ist meine antwort überflüssig, weils wahrscheinlich nicht funktioniert. Aber mal ganz simpel: Wieso erstellen wir nicht einfach eine zweite Variable (z.B. %Errorlevel2%), in die wir %Errorlevel% kopieren?

set /a Errorlevel2=%Errorlevel%

Wenn ich zu flach denke oder das ganze nicht funktioniert, bitte einfach überlesen ;)

LG DS4