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 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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 247284
Url: https://administrator.de/contentid/247284
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
22 Kommentare
Neuester Kommentar
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.
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.
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
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
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.
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.
moin,,
code blöcke sind dir bekannt?
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)
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)
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
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
Alles andere wäre extrem kompliziert und, wie schon erwähnt, wird die Errorlevel-Abfrage nicht funktionieren.
Grüße
rubberman
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
Grüße
rubberman
Zitat von @rubberman:
grundsätzlich stellt sich mir die Frage, warum du den Befehl in einer FOR /F Schleife ausführst.
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
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
Grüße
rubberman
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
Grüße
rubberman
Moin,
ganz ehrlich....
Nehmen wir mal den nicht allzu theoretischen Fall an:
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
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
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ß
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ß
Salü,
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.
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
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.
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
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