nicknack
Goto Top

Per Batchdatei Datentypen sichern und zurücksichern

Hallo zusammen.
Ich soll bestimmte Dateitypen mit ihrer Lokation sichern (z.b. nsf) .
Später sollen diese gesicherten Dateien an die alten Orte (Lokationen) zurücksichern werden.
Z.b. ist das bei einem Rechneraustausch der Fall.
Das Problem bei mir ist die Rücksicherung und habe schon diverse FOR SChleifen ausprobiert, komme da aber auf keinen grünen Zweig.
(Findstr in Verbindung mit Copy oder SET was auch immer)
Es wird eine Logdatei namens mycopy.txt mit absoluter Pfadangabe und vollen Namen erstellt.

So das ist mein Quellcode.
@echo off
Echo Sichern der Lotus Notes-Einstellungen (benutzerspezifisch)
Echo Diese Einstellungen werden unter y:\Backup_Lotus gesichert

set original=%programfiles%\Lotus\Notes\Data
set backup=y:\Backup_Lotus
set pipe=%backup%\wiederherstellung.cmd

rd %backup% /s /q
mkdir %backup%

Rem Suche nach der Dateiendung, Erstellung der Logdatei

for /f %%e in ('dir /s /b C:\*.nsf') do copy /y "%%e" %backup% && echo %%e >> %backup%\mycopy.txt  

pause

REM Hier soll zum Testen die Forschleife rein, damit probiert wird ob die Rücksicherung erfolgt.

dir %backup%\*.nsf /b >> %backup%\new_copy.txt

REM Hier einige meiner Mistakes.
rem for /f "delims"=" %%i in (%backup%\mycopy.txt) do set "x=%%i"  
rem echo %x%
rem for /f %i IN (%%backup%%\new_copy.txt) echo ('findstr /c:"AgentRunner.nsf" %%backup%%\mycopy.txt')  
rem copy /y AgentRunner.nsf ('findstr /b:"AgentRunner.nsf" "mycopy.txt"')  
rem for /F "delims=*" %%f in (%backup%\new_copy.txt) do copy /y %%f *.*  
pause

REM Hier stehen weitere Anweisungen die Funktionieren 

REM Hier wird eine CMD Datei erstellt, die in den Ordner für die Rücksicherung reingelegt wird

echo @ echo off >> %backup%\wiederherstellung.cmd
echo echo Lotus Notes-Einstellungen (benutzerspezifisch) >> %pipe%
echo xcopy /e /y %backup%\Data\*.* %original%\*.* >> %pipe%
pause

Content-Key: 147001

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

Printed on: April 26, 2024 at 15:04 o'clock

Member: BigWim
BigWim Jul 15, 2010 at 15:46:08 (UTC)
Goto Top
Ich versteh das Problem jetzt nicht so ganz. Vielleicht hast Du ein kleines Beispiel dazu.

Was ich hier im Forum gelernt habe:

Das hier
for /f "delims"=" %%i in (%backup%\mycopy.txt) do set "x=%%i"  
echo %x%
funktioniert nur, wenn Du SetLocal ENABLEDELAYEDEXPANSION einschaltest. Lies mal setlocal /? nach ....

Ansonsten probiere es mal so, ob die Schleife in Ordnung ist
for /f "delims"=" %%i in (%backup%\mycopy.txt) do echo %%i  


Markus
Member: Biber
Biber Jul 15, 2010 at 16:54:29 (UTC)
Goto Top
Moin NickNack,

ich würde in diesem Fall eine einfachere Strategie wählen.

a) Sichern & protokollieren aller *.nsf-Dateien
xcopy C:\*.nsf Y:\Backup\Lotus\%computername%_%username%\ /s >"Y:\Backup\Lotus\%computername%_%username%\%date%.log"

b) Rücksichern geht doch genauso ohne in ein Protokoll reinzuschauen
xcopy Y:\Backup\Lotus\%computername%_%username%\*.nsf C:\*.nsf /s

Grüße
Biber
[Edit] Ohne %computername% isses irgendwie noch schlauer beim Rechnertausch... siehe unten [/Edit]
Mitglied: 60730
60730 Jul 15, 2010 at 17:05:30 (UTC)
Goto Top
*hust*
Zitat von @Biber:
Moin NickNack,

ich würde in diesem Fall eine einfachere Strategie wählen.
*räusper*
Lord Biber braucht ne Brille...
Z.b. ist das bei einem Rechneraustausch der Fall.

also bis auf %computername% - würd ich das haargenauso machen face-wink

[OT]Apropos Haare - der Biber ist nicht nur bei den Temperaturen entschuldigt. - der pipifaxEinwand ist mir ja schon fast peinlich*flitz*[/OT]

edit - fast vergessen...

ganz am Anfang würde ich noch ein
Tasklist |find "otus" && echo Lotus Notes ist geöffnet bitte schliessen
oder
Tasklist |find "otus" && Taskkil /F /IM "wieSichDieExeAuchImmerNennt.exe" echo Lotus Notes war geöffnet.
Member: Biber
Biber Jul 15, 2010 at 17:15:46 (UTC)
Goto Top
*lach* @t-mo,

okay, da hast du vollkommen Recht..
Also - dann bitte oben jegliches Vorkommnis von %computername% streichen.
Dann ist es mehr als ausreichend, wenn alles %username%-bezogen gesichert und zurückgespielt wird.

[OT]
Und es hat heute nichts mit den Temperaturen zu tun... die sind erträglich.
Nein, hier im Büro lief den ganzen gatesverdammten Tach ein Billich-Radio (Marke Werbegeschenk), mit dem nur zwei ver###ne Sender halbwegs klar zu empfangen sind.
Und natürlich die beiden, die von früh bis spät immer nur alles von einer einzigen selbstgebrannten CD runterspielen (Lady Gaga, Shakira, Unheilig, Lena, 20% auf alles außer Tiernahrung und von vorn)

Okay, jetzt ist der Kollege Radiobesitzer gegangen und seine Mach-Mich-Meschugge-Maschine im Eisfach unseres Kühlschranks.
Das findet es nie wieder... hoffe ich.
[/OT]

Grüße
Biber
Member: NickNack
NickNack Jul 15, 2010 at 19:12:30 (UTC)
Goto Top
Danke für die schnelle und gute Antworten. Und für den Hinweis mit Taskkill. Werde das auch einbauen. face-smile

Ist echt Betriebsblindheit gewesen. =/
Bzw kurz vor Feierabend und die letzten 2 Haare auf dem Kopf sind dabei verglüht.
Habt ihr es gut überhaupt Sound zu haben.
Entweder habe ich schweigen im Walde, das dauernde Telefonklingeln oder die Hotlinemelodie anhören. Eher der letzteren beiden zu häufig. face-confused

Beide Varianten funktionieren erst einmal. Testweise auf andere Datentypen losgelassen. Da aber mein Rechner zu Hause wesentlich schneller ist als die auf Arbeit.....
Rechner mit P4 und 512 MB RAm dann zu sichern steht auf einem anderen Blatt. >.< Welche Variante dann performanter ist werde ich dann morgen hoffentlich posten.

Gibt es noch die Möglichkeit Ein Verzeichnis wie %windir% zu exkluden? Der Bluetoothstack z.b. wird auch über eine *.nsf angesteuert?
Oder gibt es irgendwie die Möglichkeit die gesicherten Dateien in %backup% von %windir% zu löschen?
Member: bastla
bastla Jul 15, 2010 at 21:13:41 (UTC)
Goto Top
Hallo NickNack und willkommen im Forum!
Gibt es noch die Möglichkeit Ein Verzeichnis wie %windir% zu exkluden?
Ungetestet etwa so:
@echo off & setlocal
set ex=%temp%\ex.txt
>%ex% echo %windir%
xcopy C:\*.nsf Y:\Backup\Lotus\%computername%_%username%\ /s /exclude:%ex% >"Y:\Backup\Lotus\%computername%_%username%\%date%.log"  
Grüße
bastla
Member: NickNack
NickNack Jul 19, 2010 at 15:04:54 (UTC)
Goto Top
dir /s /b %windir% >>%temp%\excludelist.txt
set ex = %temp%\excludelist.txt

xcopy C:\*.nsf %backup%\ /s /exclude:%ex% >"%backup%\%date%.log"  

wirkt leider auch nicht. Das Windowsverzeichnis wird trotzdem mit runtergeratert.
Member: Biber
Biber Jul 19, 2010 at 15:48:37 (UTC)
Goto Top
Moin NickNick,

in der Zeile 04 sollte auch die in Zeile01 relativ ressourcenintensiv erzeugte Monsterliste "alle 37000 Dateien aus dem %windir%-Verzeichnis verwendet werden, sonst lohnt sich der Aufwand des Erzeugens nicht.
Und vielleicht auch wieder gelöscht werden. *g

Aber von der Strategie ist es dennoch absolut ... na, es hat Potentiale.
So schreibst du, um die ein bis vielleicht drei *.nsf-Dateien, die auf dem ganzen Laufwerk C: gefunden werden, eine Gegencheckliste mit den erwähnten 37000 *.* Dateien in %windir%
Ein "DIR /s /b &windir%\*.nsf" >>%ex% sollte auch reichen.

Ansonsten
  • wenn deine Benutzer die Rechte dazu haben, ihre Lotus-Dateien irgendwo auf dem Laufwerk C:\ abzuspeichern und vielleicht dann sogar noch Verzeichnisse unter C:\[=root] anlegen dürfen:---> befrag eine Suchmaschine nach dem Begriff "hausgemachtes Leiden"

  • ich hätte erwartet, dass nur alle *.nsf-Dateien unter dem jeweiligen %userprofile% des Anwenders eingesammelt werden.
--> und alles, was er/sie sich angelegt hat auf Stick oder Laufwerk D: (oder gar auf Y:\?) oder mit der Endung "*.backupNsf" --> seine eigene Verantwortung. Mail an alle mit Hinweis "Ich Admin sichere eure Standard-Dateien - für eure Sonderlocken seid ihr selbst alt genug"

  • und drittens - nun bekomm mal keine feuchten Augen wegen der Performance. Du musst doch nicht danebenstehen und auf den Bildschirm starren, wären da die Platten abgegrast werden. Geh solange einen Cappu trinken oder arbeite.

Grüße
Biber
Member: NickNack
NickNack Jul 19, 2010 at 16:02:59 (UTC)
Goto Top
Wenn es nicht explizit geht, kann man dann nicht implizit wie oben beschrieben mit einer Vorschleife realisieren?

Oben wurde das erwähnt und mir gehen die Gedanken bzw. die Ideen aus. Forschleifen mögen mich nicht... *panisch sich umschaut, verfolgungswahn hat*
Das mit Setlocal hat auch leider nicht geklappt. Langsam an den Fingernägel kau.


@echo on & setlocal 
Echo Sichern der Lotus Notes-Einstellungen (benutzerspezifisch)
Echo Diese Einstellungen werden unter y:\Backup_Lotus gesichert

set original=%programfiles%\Lotus\Notes\Data
set backup=y:\Backup_Lotus
set pipe=%backup%\wiederherstellung.cmd

set SuchLaufwerke=C D 
set Suchmuster=reg

rd %backup% /s /q
mkdir %backup%

pause
REM Prüfung ob auf dem Laufwerk c oder d wie oben angegeben nach einem Muster 
if "%Suchmuster%"=="" exit  
for %%d in (%SuchLaufwerke%) do (   
        dir /s /b %%d:\*.%Suchmuster% >> %temp%\bla.txt
	if exist "%temp%\bla.txt" dir "%temp%\bla.txt"| find "0 Byte" >NUL && goto ende || goto backup  
    )
pause
:backup
REM Hier sollen dann die in der Bla.txt geschriebenen Dateien einfach nur irgendwie gesichert werden. Absolute Pfade sind drin. 
REM For (in bla.txt)  xcopy /s %backup% 
Member: NickNack
NickNack Jul 19, 2010 at 16:10:11 (UTC)
Goto Top
Biber mein Problem ist. Ich bin u.a. EDV Techniker im Vorortservice. Ich muss danebenstehen. -.-'
Die lassen einen nicht weg bis alles Schön und Schick mit Schleife...
Und leider hatten manche die damals Rootrechte und nach 5 Jahren wissen die AW nicht mehr wo die sie hingelegt haben.
Ergo muss ich den Klapperstorch machen und suchen. Und Big Brother hoogendoogle habsch auch schon gefragt.

Die Verantwortung der Datensicherung liegt leider bei uns wenn wir Rechner austauschen. Lokale Datensicherung war damals nicht so das grosse Thema. Naja egal. face-smile
Member: bastla
bastla Jul 19, 2010, updated at Oct 18, 2012 at 16:42:54 (UTC)
Goto Top
Hallo NickNack!

Magst Du nicht doch Deine Zeilen 1-3 (oben) gegen meine Zeilen 1-3 (knapp darüber) tauschen? Dann hat die "Monsterliste" auch nur eine Zeile ... face-wink
Dein Vorschlag mit For-Schleifen könnte (ungetestet) etwa so abgewandelt werden:
@echo on & setlocal 
Echo Sichern der Lotus Notes-Einstellungen (benutzerspezifisch)
Echo Diese Einstellungen werden unter y:\Backup_Lotus gesichert

set "original=%programfiles%\Lotus\Notes\Data"  
set "backup=y:\Backup_Lotus"  
set "pipe=%backup%\wiederherstellung.cmd"  

set "SuchLaufwerke=C D"  
set "Suchmuster=reg"  
set "Log=%backup%\Log.txt"  

rd "%backup%" /s /q  
md "%backup%"  

pause
REM Prüfung ob auf dem Laufwerk c oder d wie oben angegeben nach einem Muster 
if "%Suchmuster%"=="" goto :eof  
for %%d in (%SuchLaufwerke%) do (   
    for /f "delims=" %%i in ('dir /s /b /a-d %%d:\*.%Suchmuster%') do if %%~zi gtr 0 xcopy "%%i" "%backup%%%~pnxi*"|findstr /v /c:"1 Datei(en) kopiert">>"%Log%"  
)
pause
Grüße
bastla
Member: NickNack
NickNack Jul 19, 2010 at 17:51:46 (UTC)
Goto Top
@ bastla.
Wuffffffffaaaaa was für ein Construct. Geht das auch BITTE nochmal etwas ausführlicher was die ganzen Abkürzungen bedeuten?
Weiiiiiiil. Es funktioniert. Und wie. Da lüppppt. face-smile
(Test unter Windows Vista oder 7 fördert zwar ein paar "0 Dateien wurden kopiert" laut Log. Woran das liegt kann ich dann auch die Kristallkugel fragen.)

Aber alle Dateien die ich mal testweise angelegt habe wurden auch gefunden. O.O

Das mit Deinen Set und excludieren habe ich so 1 zu eins übernommen, kam immer Pfadfehler etc. =/
Bin dann nochmal beim Nachlesen darauf gekommen das er eine Dateiliste braucht.
Das was ich oben geschrieben habe war dann die Holzhammermethode um zu sehen ob es überhaupt geht mit. Ergebnis war dann nein geht nicht.
Member: Biber
Biber Jul 19, 2010 at 18:46:45 (UTC)
Goto Top
Moin NickNack,

jetzt machst du mich auch neugierig...
Das mit Deinen Set und excludieren habe ich so 1 zu eins übernommen, kam immer Pfadfehler etc. =/
Kannst du das mal genauer beschreiben (Originalfehlermeldung) bitte?

Ich kann es nicht reproduzieren - auch wenn ich bastlas ja wirklich viel schlankere Methode verwende.

-> wenn ich in meiner excl.lst stehen habe
C.\Windows
.. in klein oder gross, von Hand getippt oder aus der aufgelösten %windir% Variablen, mit oder abschließenden Backslash...
---> dann werden alle relevanten Dateien ausgeschlossen.

Der einzige Fall, in dem ich ein Fehlverhalten provozieren kann ist, wenn ich
  • auf Root des Quellverzeichnisses stehen (also meinetwegen auf "c:\" einen XCopy-Befehl absetze mit /s und /Exclude und in der Quellverzeichnis-Angabe nur eine Dateimaske stehen habe.
Beispiel:
XCOPY *.nsf d:\temp\ /s /exclude:excl.lst
--> wenn dann kopiert wird mit allen Unterverzeichnissen, dann ist
Quelle z.B. C:Windows\system32\Sicherung.bat ("C:Windows" OHNE "\" dazwischen)
und in der Excludedatei wird vergleichen mit "C:\Windows" MIT Backslash dazwischen.
In diesem Fall wird nichts exkludiert, da der Vergleich keine Übereinstimmung findet.

Aber so ein Konstrukt ist aus deinen geposteteten Zwischenschnipseln nicht ersichtlich.
Bitte poste auch nochmal die Ausgaben von
Set temp
set windir

Grüße
Biber
Member: bastla
bastla Jul 19, 2010 at 18:49:25 (UTC)
Goto Top
Hallo NickNack!
Geht das auch BITTE nochmal etwas ausführlicher was die ganzen Abkürzungen bedeuten?
Findest Du zwar in der Hilfe ("for /?" ziemlich gegen Ende), aber ich zerpflücke
for /f "delims=" %%i in ('dir /s /b /a-d %%d:\*.%Suchmuster%') do if %%~zi gtr 0 xcopy "%%i" "%backup%%%~pnxi*"|findstr /v /c:"1 Datei(en) kopiert">>"%Log%"
mal etwas ...
for /f "delims=" %%i in ('dir /s /b /a-d %%d:\*.%Suchmuster%') do
liefert ganz ohne Temp-Datei alle zum Suchmuster passenden Dateien (wg "/a-d") als "%%i" mit vollem Pfad und ohne dass Leerzeichen (als Default-Trennzeichen) diesen Pfad "auseinanderbrechen" würden (dazu "delims=").
if %%~zi gtr 0
überprüft die Dateigröße ("%%~zi") der jeweiligen Datei.
xcopy "%%i" "%backup%%%~pnxi*"
erstellt unterhalb von "%backup%" den "Original-Pfad" ("%%~pi") und lässt den Dateinamen ("%%~nxi") dabei unverändert - ein
xcopy "%%i" "%backup%%%~p"
sollte es eigentlich auch tun. Je nach Variante ist das letzte Zeichen des Zieles von Bedeutung: bei vollständiger Angabe (also Pfad + Name + Extension) sorgt der abschließende "*" dafür, dass "xcopy" das Ziel als Datei erkennt und daher nicht danach fragen muss (einen Schalter analog zu etwa "/i" gibt es hier nicht). Wird als Ziel nur der Pfad angegeben, enthält dieser ("%%~pi") automatisch einen "\" am Ende, wodurch feststeht, dass das Ziel ein Ordner ist.

Da im Log nur die Dateipfade landen sollen, wird schließlich mit
|findstr /v /c:"1 Datei(en) kopiert">>"%Log%"
die "Vollzugsmeldung" herausgefiltert ...
Zum "Exclude": Lt Hilfetext
           Kopiervorgang ausgeschlossen. Beispiel: Bei der
           Zeichenfolge \obj\ oder .obj werden alle Dateien
           unterhalb des Verzeichnisses OBJ bzw. alle Dateien mit
           der Erweiterung .obj vom Kopiervorgang ausgeschlossen.
und eigenen Tests (allerdings nur unter XP SP3) sollte ein Inhalt "C:\Windows"der Datei "%temp%\ex.txt" genügen, um jegliche in oder unterhalb von "C:\Windows" liegende Datei vom Kopieren auszuschließen - so würden bei mir bei einer "/l"-Simulation (Direkteingabe in der CMD-Shell) mit
D:\>set ex=%temp%\ex.txt

D:\>>%ex% echo %windir%

D:\>xcopy c:\*.dll d:\ /s /exclude:%ex% /l
zwar "3542 Datei(en) kopiert" (und ja, bei einer "Höhe" der "Fensterpuffergröße" von "9999" kann ich mir mit ein wenig Scrollen alle im Konsolenfenster ansehen face-wink), aber keine davon aus einem mit "C:\Windows" beginnenden Pfad ...

Grüße
bastla
Member: NickNack
NickNack Jul 20, 2010 at 19:53:43 (UTC)
Goto Top
So also ich noch einmal. face-smile Also echt Sptize wie ihr mir geholfen habt. =) War auch gleich einmal Testen. Erfolgreich. face-smile
Tests verliefen unter WinXp, Vista und Win7 alle Fullpatches erfolgreich.

Zu der Fehlermeldung mit der Pfad :
Das System kann den angegebenen Pfad nicht finden.

Ich hatte das oben geschriebene Script kopiert, als cmd abgespeichert und gestartet. (Natürlich die Zahlen da oben entfernt.) Selbst als ich das noch einmal auf die Console kopiert habe und gestartet habe, kam die Fehlermeldung.
Wollte irgendwo halt nicht und habe es dann handisch noch einmal ausprobiert. Und dann funktionierte es
Anscheinend war ein Leerzeichen (ALT+160) der Auslöser das er nicht wollte. >.<

Und danke noch einmal für die Super-ausführliche verschachtelte For-Schleife. Ich denke das sollten hoffentlich vieeeeeeeeele Leser auch verstehen.
Beide funktionieren gleich gut (subjektive Zeitmessung).
Mein Problem war das ich nicht die ganzen Abkürzungen wie
%%~zi gtr 0 und ~pnxi so richtig verstanden habe.

Quellcode kann ich gerne gekürzt posten wenn ihr mögt. face-smile