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

Variable innerhalb einer FOR Schleife ein 2. Mal nutzen

Frage Entwicklung Batch & Shell

Mitglied: mick111

mick111 (Level 1) - Jetzt verbinden

23.08.2014 um 19:26 Uhr, 1418 Aufrufe, 22 Kommentare

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
Mitglied: Lochkartenstanzer
23.08.2014, aktualisiert um 19:37 Uhr
Moin,

Suchfunktion hilft: http://www.administrator.de/wissen/tutorial-zur-for-schleife-155681.htm ...

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.
Bitte warten ..
Mitglied: rubberman
23.08.2014 um 19:38 Uhr
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
Bitte warten ..
Mitglied: mick111
23.08.2014 um 20:04 Uhr
Hallo LKS,

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

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

Gruss
Mick
Bitte warten ..
Mitglied: Lochkartenstanzer
23.08.2014 um 20:08 Uhr
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.
Bitte warten ..
Mitglied: mick111
23.08.2014 um 20:13 Uhr
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
Bitte warten ..
Mitglied: Nr60730
23.08.2014 um 20:16 Uhr
moin,,

code blöcke sind dir bekannt?


01.
Set file= 
02.
for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y') do set "file=%%~a" 
03.
 
04.
>>%Log% echo Kopiere %%~a ...& goto :eof2 
05.
rem fehlt hier nicht was oder warum springts du mit goto eine Zeile tiefer 
06.
:eof2 
07.
 
08.
IF %Errorlevel% EQU 0 ( 
09.
>>%Log% Echo %time% Backup %file% erfolgreich kopiert 
10.
) Else ( 
11.
>>%Log% Echo %time% Backup %file% NICHT kopiert, Fehler %Errorlevel% 
12.
)
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)
Bitte warten ..
Mitglied: Lochkartenstanzer
23.08.2014, aktualisiert um 20:24 Uhr
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
Bitte warten ..
Mitglied: rubberman
23.08.2014 um 20:26 Uhr
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
01.
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
Bitte warten ..
Mitglied: Lochkartenstanzer
23.08.2014 um 20:29 Uhr
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
Bitte warten ..
Mitglied: mick111
23.08.2014 um 20:33 Uhr
moment, ich muss erst mal sehen, wie das mit den Code Blöcken ist.
Dann kopiere ich mein ganzes Script mal

Mick
Bitte warten ..
Mitglied: mick111
23.08.2014 um 20:56 Uhr
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

01.
REM @echo off 
02.
REM ******************** START Kopiert die aktuelle Sicherung auf 2 Ziele ************************** 
03.
Set Quelle=D:\Vault_Backup 
04.
Set Ziel1=D:\Vault_Backup_Sammler 
05.
Set Ziel2=\\SERVER2\g\vm-vltprod 
06.
Set /a MaxDirs=3 
07.
Set /a counter=0 
08.
 
09.
set LogFileDir=%Quelle%_Log 
10.
set LogFile=%~n0.log 
11.
set Log=%LogFileDir%\%LogFile% 
12.
 
13.
>>%log% echo. 
14.
>>%log% echo. 
15.
 
16.
>>%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* 
17.
>>%log% echo ----------------------------------------------------------------- 
18.
>>%Log% Echo 1 Datum: %date% %time% Start Protokoll %LogFile%  
19.
>>%log% echo ----------------------------------------------------------------- 
20.
>>%log% echo. 
21.
 
22.
REM >>%Log% Echo 2 Datum: %date% %time% %Ziel1% 
23.
REM for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel1%" /I /H /E /Y') do >>%log% echo Kopiere %%~a ... & REM goto :eof1 
24.
REM :eof1 
25.
REM IF %Errorlevel% EQU 0 ( 
26.
REM >>%Log% Echo %time% Datei %%~a erfolgreich kopiert 
27.
REM ) Else ( 
28.
REM >>%Log% Echo %time% Datei %%~a NICHT kopiert, Fehler %Errorlevel% 
29.
REM ) 
30.
REM>>%log% echo. 
31.
REM>>%log% echo ------------------------------------------------------ 
32.
REM>>%log% echo. 
33.
 
34.
>>%log% echo ----------------------------------------------------------------- 
35.
>>%Log% Echo 3 Datum: %date% %time% Ziel2=%Ziel2% 
36.
>>%log% echo ----------------------------------------------------------------- 
37.
for /f "tokens=3 delims=\" %%a in ('xcopy "%Quelle%%1" "%Ziel2%" /I /H /E /Y') do >>%Log% echo Kopiere %%~a ...& goto :eof2 
38.
:eof2 
39.
 
40.
IF %Errorlevel% EQU 0 ( 
41.
>>%Log% Echo %time% Backup %%~a erfolgreich kopiert 
42.
 ) Else ( 
43.
>>%Log% Echo %time% Backup %%~a NICHT kopiert, Fehler %Errorlevel% 
44.
45.
 
46.
 
47.
REM ******************** ENDE Kopiert die aktuelle Sicherung auf 2 Ziele  *********************** 
48.
 
49.
 
50.
REM **************************** START Erhalte max 3 Vault-Backups ****************************** 
51.
 
52.
>>%Log% echo. 
53.
>>%Log% echo. 
54.
>>%log% echo ----------------------------------------------------------------- 
55.
>>%Log% Echo 4 Datum: %date% %time% 
56.
>>%log% echo ----------------------------------------------------------------- 
57.
@echo :: ALTE SICHERUNGEN LOESCHEN  
58.
 
59.
for /f "delims=" %%i in ('dir /Ad /A-h /b /O-N "%Quelle%"') do call :loop "%%i" 
60.
goto :eof 
61.
 
62.
:loop 
63.
set /a counter=%Counter%+1 >>%Log% 
64.
if %counter% LEQ %MaxDirs% (echo %~1 ...%Counter% ^<^= %MaxDirs%....ok, kann bleiben ) >>%Log% & goto :eof 
65.
 
66.
@echo BACKUP BEENDET! 
67.
 
68.
REM **************************** Start Backupordnergröße auslesen ******************************* 
69.
 
70.
>>%log% echo. 
71.
set temp="%temp%\temp.vbs" 
72.
 
73.
echo WScript.Echo Round(Abs(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024/1024),4)>%temp% 
74.
for /f %%i in ('cscript //nologo %temp% "%Quelle%\%~1"') do set Gr=%%i 
75.
>>%LoG% echo Das Backup %Quelle%\%~1 ...   
76.
>>%LoG% echo ... welches gelöscht wurde, war %Gr% GB gross. 
77.
del %temp% 
78.
 
79.
REM **************************** Ende Backupordnergröße auslesen ******************************** 
80.
rd /s /q "%Quelle%\%~1" 
81.
REM goto :eof 
82.
REM **************************** ENDE Erhalte max 3 Vault-Backups *******************************
Bitte warten ..
Mitglied: rubberman
23.08.2014 um 21:07 Uhr
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
Bitte warten ..
Mitglied: mick111
23.08.2014 um 21:14 Uhr
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 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
Bitte warten ..
Mitglied: rubberman
23.08.2014, aktualisiert um 21:19 Uhr
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
Bitte warten ..
Mitglied: mick111
23.08.2014 um 21:23 Uhr
ich habe Dir eine PN geschickt
Bitte warten ..
Mitglied: Nr60730
24.08.2014 um 11:11 Uhr
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
Bitte warten ..
Mitglied: mick111
24.08.2014 um 12:59 Uhr
Hallo,

Du hast schon Recht. Nur was ist 100% sicher?
Wo die Sicherungen stattfinden, hat niemand Zugriff, höchstens der Admin.... USER
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
Bitte warten ..
Mitglied: Nr60730
24.08.2014 um 13:17 Uhr
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ß
Bitte warten ..
Mitglied: mick111
24.08.2014 um 13:44 Uhr
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 Scheiss, 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
Bitte warten ..
Mitglied: Nr60730
24.08.2014 um 20:35 Uhr
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.
Bitte warten ..
Mitglied: Xaero1982
25.08.2014 um 09:25 Uhr
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ß
Bitte warten ..
Mitglied: citroendsvier
26.08.2014 um 10:10 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
Schleife mit todos CMD

Frage von TommyDerWalker zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Router & Routing
gelöst Empfehlung günstiges ADSL2+ nur Modem (10)

Frage von TimMayer zum Thema Router & Routing ...

Server-Hardware
Lenovo Server System X 3650 M5 Festplatten (9)

Frage von Hendrik2586 zum Thema Server-Hardware ...