derwowusste
Goto Top

Verschieben von Ordnern, die das Archivbit gesetzt haben

Moin!
Gibt es eine Software, die in der Lage ist, anhand des Archivbits von Ordnern diese zu verschieben?
Ich möchte, dass Benutzer das Archivbit setzen und nachts eine Software auf dem Fileserver läuft, die diese Ordner findet und ins Archiv verschiebt, möglichst automatisch in der Art, dass \\server\homes\benutzerX\VerzeichnisY zu \\server\archiv\benutzerX\VerzeichnisY wird.

Auch für alternative Ideen wäre ich sehr dankbar.

Content-ID: 113150

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

pxxsxx
pxxsxx 03.04.2009 um 14:50:11 Uhr
Goto Top
Hallo,
evtl. lässt sich das mit xcopy lösen.( xcopy /? )
eine kleine Batchdatei schreiben in der erst mit xcopy die Daten mit Archivbit kopiert werden und dann wenn nötig die Daten löschen.
Schalter /A Kopiert nur Dateien mit gesetztem Archivattribut und ändert das Attribut nicht.

Aber:
Willst du nachts den kompletten Fileserver nach Ordnern mit Archivbit durchsuchen lassen? Wieviel ist das?

Andere Möglichkeit:
erstelle eine Batchdatei mit folgendem Inhalt:
echo %1 >> liste.txt
wenn der Benutzer den zu archivierenden Ordner auf diese Batchdatei zieht, wird der Pfad des Ordners in die Datei "liste.txt" eingetragen.
Dann lässt du (ebenfalls mit einer Batchdatei) die Pfade in der Liste abarbeiten und verschieben.
Wenn der Vorgang abgeschlossen ist, löschst du die Datei liste.bat sie wird wieder erstellt, sobald man wieder was auf die Batchdatei zieht.

gruß
Peter
pxxsxx
pxxsxx 03.04.2009 um 14:53:44 Uhr
Goto Top
Nachtrag:
wenn du für jeden Benuter eine eigene Liste erstellst, kannst du auch nach Benutzer archivieren.
echo %1 >> %username%.txt
DerWoWusste
DerWoWusste 03.04.2009 um 14:59:01 Uhr
Goto Top
Hi!
Ich finde die Idee mit der Batch sehr gut! In der Tat wäre ein Durchscannen des Fileservers zu langwierig. Ich probier's bald mal und melde mich. Danke!
pxxsxx
pxxsxx 03.04.2009 um 15:01:42 Uhr
Goto Top
Gern geschehen und viel Spass damit face-wink

Gruß
Peter
bastla
bastla 03.04.2009 um 15:53:22 Uhr
Goto Top
Hallo DerWoWusste und pxxsxx!

Ich würde auch eine Batch-Lösung verwenden, und da ja das Ziel eigentlich das Verschieben ganzer Ordner ist, etwa so vorgehen:
@echo off & setlocal
set "Quelle=\\server\homes"  
set "Ziel=\\server\archiv"  

for /f "delims=" %%i in ('dir /s /b /aad "%Quelle%" 2^>nul') do (  
    if exist "%%i" call :ProcessDir "%%i"  
)
goto :eof

:ProcessDir
set "ZielPfad=%~1"  
call set "ZielPfad=%%ZielPfad:%Quelle%=%Ziel%%%"  
xcopy /e /y %1 "%ZielPfad%\" >nul && echo rd /s /q %1  
goto :eof
Damit beim Testen nicht allzuviel schiefgeht, steht vor dem Löschbefehl (der nur nach einem erfolgreichen Kopieren ausgeführt werden sollte) in der Zeile 13 noch ein "echo", sodass zwar kopiert wird, für das Löschen aber nur eine Simulation durch Ausgabe des Löschbefehles erfolgt.

Grüße
bastla
pxxsxx
pxxsxx 03.04.2009 um 16:33:43 Uhr
Goto Top
Auch ne Möglichkeit face-wink
Aber ich könnte mir vorstellen, dass die Benutzer Probleme damit haben, das Archivbit zu setzen. Ich hab hier auch ein paar so Kollegen, wenn ich denen sag:

"wenn du was archivieren willst, klick mit der rechten Maustaste auf den Ordner, dann auf Eigenschaften, dann auf den Button "Erweitert". Und jetzt setzt du den Haken bei "Ordner kann archiviert werden". Dann klickst du auf OK. Im nächsten Fenster klickst du auch auf OK. Dann wird nochmal nachgefragt, Ob du nur den einen Ordner oder auch das darunter markieren willst. Da kannst du "nur für diesen Ordner übernehmen" auswählen und dann nochmal auf OK."

kommt definitiv nix vernüftiges bei raus.

Wenn ich denen aber sag: "Wenn du was archivieren willst, zieh den Ordner mit der Maus auf dieses Symbol"
kommen sie wesentlich leichter zurecht.

Allerdings lässt sich das auch kombinieren indem man beim ziehen auf eine Batchdatei das Archivbit für den gezogenen Ordner setzt.

@echo off
attrib +A %1

Windows kann so einfach zu bedienen sein - wenn man die DOS-Box benutzt face-wink

Gruß
Peter
bastla
bastla 03.04.2009 um 16:40:43 Uhr
Goto Top
... wobei dann in dieser Batchdatei eigentlich auch gleich das Verschieben erledigt werden könnte ...

Grüße
bastla
pxxsxx
pxxsxx 03.04.2009 um 16:55:51 Uhr
Goto Top
Das verschieben soll ja in der Nacht passieren. Ich denk mal, damit die Benutzer nichts davon mitbekommen oder nicht das komische schwarze Fenster wegklicken. Ausserdem geht das kopieren schneller, wenns lokal auf dem Server gestartet wird, als wenn man am Client übers Netz kopiert. (es liegen ja Quelle und Ziel auf dem Server) Und das Netzwerk wird nicht so belastet.
Man könnte auch z.B. über Tasks oder ein Logoff-Script bestimmte Ordner automatisch für die Archivierung markieren. Alle Markierten Ordner würden dann einmal gesammelt nachts lokal am Server von einem Ordner in den anderen kopiert.
Am Client wenn ich das Kopieren starte, holt er die Dateien vom Server und schiebt sie wieder auf den Server. Macht keinen Sinn face-wink Es sei denn, die Batch wird am Server hinterlegt und von einer Batch, die am Client liegt via Telnet gestartet.

Wie gesagt, eine Kombination wäre gut:
Tagsüber die Ordner markieren und nachts verschieben.

Gruß
Peter
bastla
bastla 03.04.2009 um 17:04:31 Uhr
Goto Top
ausserdem geht das kopieren schneller, wenns lokal auf dem Server gestartet wird, als wenn man am Client übers Netz kopiert. (es liegen ja Quelle und Ziel auf dem Server)
... womit Du natürlich Recht hast (allerdings ist es dann auch nicht wirklich sinnvoll, Quelle und Ziel per UNC-Pfad anzugeben).

Grüße
bastla
pxxsxx
pxxsxx 03.04.2009 um 17:16:44 Uhr
Goto Top
Das lässt sich ja in deiner Batch-Datei regeln indem man anstatt

set "Quelle=\\server\homes"
set "Ziel=\\server\archiv"

z.B.
set "Quelle=d:\Daten\Homes"
set "Ziel=d:\Archiv\Homes"

angibt.

Evtl. währe es mal interssant, eine vernünftige Backupsoftware als Batch zu basteln. Mit Wbat könnte man auch noch ein schönes GUI dazu bauen.

Gruß
Peter
bastla
bastla 03.04.2009 um 17:32:18 Uhr
Goto Top
Das lässt sich ja in deiner Batch-Datei regeln
... dazu steht's auch gleich am Anfang face-wink

Bezogen hatte ich mich allerdings auf die Vorgabe von DerWoWusste ...

Grüße
bastla
pxxsxx
pxxsxx 03.04.2009 um 17:35:31 Uhr
Goto Top
Da geh ich doch mal von einem Flüchtigkeitsfehler aus. - Ich mach jetzt Feierabend, schönes Wochenende noch.

Gruß
Peter
bastla
bastla 03.04.2009 um 17:39:26 Uhr
Goto Top
Auch Dir ein schönes Wochenende ...

bastla
DerWoWusste
DerWoWusste 07.04.2009 um 16:51:03 Uhr
Goto Top
Moin!
Das ist soweit schön. Am tollsten wäre natürlich ein Kontextmenüeintrag, ähnlich dem "senden an", was Windows schon mitbringt, der dem Nutzer ein direktes Verschieben ins Archiv ermöglichen würde. Traut sich das jemand zu?
Ich habe auch geschaut, aber nur gefunden, wie man per Kontextmenü in bestimmte Ordner verschieben kann (http://www.vistax64.com/tutorials/89196-context-menu-add-copy-folder-mo ..), die man auswählem muss, nicht aber in Zielordner, deren Pfade sich aus aus einer Abwandlung ihres bisherigen Pfades ergeben.

Ist zufällig jemand hier nicht nur Held an der Kommandozeile, sondern auch gewieft, was Kontextmenüeinträge angeht?
bastla
bastla 07.04.2009 um 19:45:07 Uhr
Goto Top
Hallo DerWoWusste!

Wenn's nur darum geht, das Archivbit für einen Ordner zu setzen, könntest Du tatsächlich den entsprechenden Batch einfach in "SendTo" platzieren ...

... als Kontextmenüeintrag sollte sich das aber mit der folgenden .reg-Datei auch machen lassen:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Archivieren]
@="Ordner &archivieren"  

[HKEY_CLASSES_ROOT\Directory\shell\Archivieren\Command]
@="attrib +A %1"  
Die [Edit] jetzt auch erkennbare [/Edit] Leerzeile am Ende soll übrigens auch mit in die Datei.
Als Alternative ein Batch (hier für das Gegenteil):
reg add HKCR\Directory\shell\NichtArchivieren /ve /d "Ordner &nicht archivieren" /f  
reg add HKCR\Directory\shell\NichtArchivieren\Command /ve /d "attrib -A %%1" /f  

Grüße
bastla
DerWoWusste
DerWoWusste 08.04.2009 um 15:23:26 Uhr
Goto Top
Das fällt mal wieder unter "(erschreckend) einfach, wenn man weiß wie" face-smile
Magst Du mir noch einen letzten Tipp geben? Wenn ich anstatt attrib +A %1 gleich einen move Befehl nutzen möchte, zum Beispiel cmd /k move %1 \\server\archiv, gelingt dies nicht, die Nutzung des Kontextmenüs bringt dann als Fehlermeldung "Zugriff verweigert", da move nur auf dem selben Laufwerk funktioniert.

Da move =md Ziel, copy Quelle\*.* ziel + rd Quelle, wäre das ja als Umweg, eventuell mittels && verknüpft, denkbar, aber ich bekomme es nicht hin. Wie bekomme ich das Zielverzeichnis erstellt (aus \\server\homes\benutzerX\ProjektY soll \\server\archiv\BenutzerX\ProjektY werden)
bastla
bastla 08.04.2009 um 18:37:11 Uhr
Goto Top
Hallo DerWoWusste!

Vielleicht schafft Biber es, diesen Einzeiler in die Registry zu bringen:
setlocal enabledelayedexpansion & set "ZielPfad=%~f1" & set "ZielPfad=!ZielPfad:\\server\homes\=\\server\archiv\!" & xcopy /e /y %1 "!ZielPfad!\">nul && rd /s /q %1
- mir gelingt's leider auch mit "cmd /v:on /c" nicht. face-sad

Grüße
bastla
Biber
Biber 08.04.2009 um 19:46:00 Uhr
Goto Top
Moin bastla,

- mir gelingt's leider auch mit "cmd /v:on /c" nicht.
... ich weiss ja nicht genau, wo da das Problem sein könnte... *gg

Ich kann es am CMD-Prompt zumindest soweit hinbiegen, dass ich mit zwei Zeilen...
set "regval=cmd /v:on /c ^(set \"Z=%1\" ^& set \"Z=!Z:D:\temp1\=X:\test\archiv\!\" ^& @echo xcopy /e /y %1 \"!Z!\\\"^>con ^&^& @echo rd /s /q %1^&pause ^)"  
reg add HKCR\Directory\shell\NichtArchivieren\Command /ve /d "%regval%" /f  
... einen Kontext-Eintrag "NichtArchivieren" im Explorer erzeuge, der mit einem Verzeichnis unterhalb "D:\temp1" als Parameter folgendes ausführen würde:
-- angezeigtes ECHO-kontroll-CMD-Fenster:
xcopy /e /y D:\temp1\alltexts "X:\test\archiv\alltexts\"  
rd /s /q D:\temp1\alltexts
Drücken Sie eine beliebige Taste . . .

--> Gut ist also (geklappt):
  • DelayedExpansion wird angewandt -der ZielPfad !Z! wird aufgelöst
  • auch die mal-für-CMD/mal-für-REG_ADD-Maskiererei mit vorangestellten Backslashes und Carets klappt
  • und funktional klappt ja auch das ändern von D:\Temp1\whatever in X:\test\Archiv

--> nicht klappen will bei mir
  • die Verwendung der Ableitung "%~f1" statt "%1" ....3x probiert, 3x gescheitert.

--> nicht versucht:
  • ob es mit UNC-Pfaden "\\server\subX" -->"\\server\SubY\bla" auch laufen würde

Aber bis hierhin erscheint es mir noch technisch machbar, unter Wartbarkeitsgesichtspunkten allerdings absolut verwerflich.

Grüße
Biber
bastla
bastla 08.04.2009 um 20:36:53 Uhr
Goto Top
@Biber
Mal abgesehen von der konzeptionellen Seite (es müsste dann ja auch zumindest noch eine Überprüfung des Quellpfades stattfinden, da ja der Kontextmenüeintrag für alle Verzeichnisse - und nicht nur für solche in der Freigabe "\\server\homes" - angeboten wird) und der suboptimalen Wartbarkeit: Bei mir (XP Pro) endet's auch mit
@echo off & setlocal
reg add HKCR\Directory\shell\NichtArchivieren /ve /d "Ordner &nicht archivieren" /f  
set "regval=cmd /v:on /k ^(set \"Z=%1\" ^& set \"Z=!Z:D:\temp1\=X:\test\archiv\!\" ^& @echo xcopy /e /y %1 \"!Z!\\\"^>con ^&^& @echo rd /s /q %1^&pause ^)"   
reg add HKCR\Directory\shell\NichtArchivieren\Command /ve /d "%regval%" /f  
schon bei der Meldung (angezeigt per Änderung von "/c" auf "/k"):
Der Befehl "(set" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

D:\temp1>
- und da ist noch nicht einmal das "%~f1" (das ich leider bei all meinen vorhergehenden Versuchen - nur zur Sicherheit face-wink - verwenden zu sollen gemeint hatte) dabei ...

@DerWoWusste
Damit bliebe aus meiner Sicht die sinnvolle Variante ein Batch "Archiv.bat" in "SendTo".

Grüße
bastla
Biber
Biber 08.04.2009 um 21:59:42 Uhr
Goto Top
Moin bastla & DerWoWusste,

fast überflüssig zu erwähnen, dass auch ich das Ergebnis oben unter XP Pro erzeugt habe...
--> wenn denn dann nicht mal bei gleichen formalen Grundvoraussetzungen bei zwei Copy&Paste-Zeilen das gleiche reproduzierbare Ergebnis herauskommt...
> dann plädiere ich an dieser Stelle mal ausnahmsweise GEGEN eine Oneliner-Lösung.

@bastla
Aber Deiner Schlussfolgerung, ein Batch namens "Archiv.bat" wäre dann am sinnvollsten unter "SendTo"...??
Warum denn?
Wenn sich ohne eine gehörige Portion Glück oder Unbekümmertheit kein 150-Zeichen-CMD-Oneliner in das @-Feld des neues Directory-Shell-Eintrags trümmern lässt-..
-->okay. Ist dann halt so. Dann davon Finger wech. Agree.
Aber dort an diese Stelle, wo vor drei, vier Kommentaren noch "attrib +A %1" oder ähnlich stand,
wenn dort ein Batch mit "cmd /k D:\batches\ArchivViaKontextMenue.bat" aufgerufen werden würde -- reicht das denn nicht?

Und bezogen auf die aller-ursprünglichste Fragestellung ganz ganz oben im Eröffnungsbeitrag wäre das doch ohnehin nur ein Spezialfall des Jede-Nacht-Über-Alle-Ordner-Laufs.
Somit könnte man/frau doch DIESEN Batch aufbohren um einen Spezialparameter "ViaKontextMenue", damit er seinen Job nur nbezogen auf diesen einen Ordner macht und nicht auf alle.

Grüße
Biber
bastla
bastla 08.04.2009 um 22:06:37 Uhr
Goto Top
@Biber
Aber dort an diese Stelle, wo vor drei, vier Kommentaren noch "attrib +A %1" oder ähnlich stand,
wenn dort ein Batch mit "cmd /k D:\batches\ArchivViaKontextMenue.bat" aufgerufen werden würde -- reicht das denn nicht?
Ja, klar (war auch mein erster diesbezüglicher Ansatz) - ist zwar ein Schritt mehr (und der Reg-Eintrag erfordert Admin-Rechte), aber für die User etwas komfortabler (und das "/k" kann nach dem Testen dann wieder ein "/c" werden face-wink) ...

Grüße
bastla
DerWoWusste
DerWoWusste 09.04.2009 um 11:06:47 Uhr
Goto Top
So. nun komm ich auch mal wieder... face-smile

Eine Batch, die über das Kontextmenü angesprochen wird, ist doch wunderbar. Funktioniert auch bislang super mit dem "Einzeiler" von Bastla.

Riesigen Dank an Euch beide!
DerWoWusste
DerWoWusste 09.04.2009 um 11:13:31 Uhr
Goto Top
Uahhh... doch nicht abgeschlossen... was ist mit Leerzeichen in Ordnernamen, das geht nocht nicht und - wie man weiß- schwören einige auf Leerzeichen... ;) Leider sehe ich mich außer Stande, die Batch passend anzupassen.
Genauer: Via Kontextmenü geht nicht, raufziehen auf die Batch geht.
bastla
bastla 09.04.2009 um 19:04:56 Uhr
Goto Top
Hallo DerWoWusste!

Eigentlich sollten Leerzeichen berücksichtigt werden (genug Anführungszeichen hätte ich eigentlich gesetzt face-wink). Wie sieht den der Reg-Eintrag aus?
Der Batch wird etwas les- und wartbarer, wenn er nicht auf eine Zeile gequetscht ist, also etwa:
@echo off & setlocal
set "Quelle=\\server\homes"  
set "Ziel=\\server\archiv"  

set "Pfad=%~f1"  
echo %Pfad%|findstr /i /b /c:"%Quelle:\=\\%">nul || (  
    cls
    echo Bitte nur Ordner aus dem Pfad "%Quelle%" auf diese Art verschieben!  
    echo\
    pause
    goto :eof
)

call set "Pfad=%%Pfad:%Quelle%=%Ziel%%%"  
xcopy /e /y %1 "%Pfad%\" >nul && rd /s /q %1  
Grüße
bastla
DerWoWusste
DerWoWusste 09.04.2009 um 20:48:57 Uhr
Goto Top
Hi!
Der Regeintrag lautet d:\test\archiv.bat %1, genauer
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Archivieren]
@="Ordner &archivieren"

[HKEY_CLASSES_ROOT\Directory\shell\Archivieren\Command]
@="d:\\test\\archiv.bat %1"

wurde importiert.

wobei d:\test\archiv.bat weiterhin (angepasst)
setlocal enabledelayedexpansion & set "ZielPfad=%~f1" & set "ZielPfad=!ZielPfad:\\vista\h\=\\vista\a\!" & xcopy /e /y %1 "!ZielPfad!\">nul && rd /s /q %1
pause
lautet.
Das Ergebis beim Archivieren eines Ordners mit Leerzeichen (Quelle: \\vista\h\active desktop, archiviert werden soll nach \\vista\a)
--
'\\vista\h'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.

C:\Windows>setlocal enabledelayedexpansion & set "ZielPfad=\\vista\h\Active" & set "ZielPfad=!Zi
elPfad:\\vista\h\=\\vista\a\!" & xcopy /e /y \\vista\h\Active "!ZielPfad!\" 1>nul && rd /s /q \\
vista\h\Active
File not found - Active
--

Wünsche bestes Wetter und feine Ostern!

Ach ja, Dein letztes Skript als Archiv.bat bringt auch nur
--
'\\vista\h'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
File not found - Active
bastla
bastla 09.04.2009 um 20:54:50 Uhr
Goto Top
Hallo DerWoWusste!

Dann ändere den Reg-Eintrag, sodass der Parameter auf jeden Fall unter Anführungszeichen übergeben wird, also:
d:\test\archiv.bat "%~1"
Die guten Wünsche auch Dir
bastla
DerWoWusste
DerWoWusste 09.04.2009 um 21:14:08 Uhr
Goto Top
Jou... so geht's, aber nur ohne ~, also "%1"
Bestens! Vielen Dank für die Mühe.