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

Skript um Dateien samt Ordnerstruktur über SendTo zu verschieben

Frage Entwicklung Batch & Shell

Mitglied: cvoigt

cvoigt (Level 1) - Jetzt verbinden

17.09.2007, aktualisiert 19.09.2007, 3460 Aufrufe, 3 Kommentare

Hallo,

OS: Win2000 oder XP

ich habe folgendes Problem:
Ich möchte Dateien oder Ordner mit einem Script im Kontektmenü "SendTo" mit der gesammten Ordnerstruktur in ein ArchivVerzeichniss verschieben.

Beispiel:
01.
S:\ 
02.
?? Archiv 
03.
??? Abteilung 1 
04.
???? Subdir 1 
05.
????? Subdir 1a 
06.
???? Subdir 2 
07.
???? ... 
08.
?? 
09.
??? Abteilung 2 
10.
???? ... 
11.
?? 
12.
??? Abteilung 3 
13.
? ?? ... 
14.
15.
?? Abteilung 1 
16.
??? Subdir 1 
17.
???? Subdir 1a 
18.
??? Subdir 2 
19.
??? ... 
20.
21.
?? Abteilung 2 
22.
??? ... 
23.
24.
?? Abteilung 3 
25.
 ?? ...
Der Ordner Archiv ist bisher leer (nur die Abteilungs-Ordner sind angelegt - wg. ACL). Wenn jetzt ein User der Meinung ist, dass er eine bestimmte Datei/Ordner nicht mehr benötigt (aber auch nicht löschen möchte/kann - z.B. wg. Aufbewahrungsfristen HGB usw.), dann soll die Datei/Ordner mit der gesamten Struktur ins Verzeichnis Archiv\Abteilung XY\... verschoben werden.

Ich habe schon ein kleines VB-Script geschrieben, aber leider gibt es ein Problem:
Wenn der User eine Datei schon archiviert hat und später den ganzen Ordner archivieren möchte kommt es zu einem Fehler (nur Dateien oder nur Ordner funktioniert).
01.
'========================================================================== 
02.
03.
' NAME: Dateien archivieren 
04.
' VERSION: 0001 
05.
06.
' AUTOR: Christian Voigt-Sommer 
07.
' DATUM: 14.09.2007 
08.
09.
' Funktion:  
10.
'  
11.
'========================================================================== 
12.
' Änderungen:  
13.
'  
14.
'========================================================================== 
15.
 
16.
Option Explicit 
17.
 
18.
DIM fso 
19.
DIM args 
20.
DIM tmp 
21.
DIM strQuelle 
22.
DIM strQuellPfad 
23.
DIM strZielPfad 
24.
DIM strArchivPfad 
25.
 
26.
strArchivPfad="D:\TEMP\" 
27.
 
28.
sChkCScript() 
29.
 
30.
Set fso = CreateObject("Scripting.FileSystemObject") 
31.
 
32.
Set args=WScript.Arguments 
33.
If args.Count>0 Then 
34.
   strQuelle=args(0) 
35.
   tmp = InStrRev(strQuelle,"\") 
36.
   strQuellPfad = Left(args(0),tmp) 
37.
Else 
38.
   sSay "Archiviert Dateien in einem vordefiniertem Ordner" 
39.
   sSay "unter Beibehaltung der Ordnerstuktur" 
40.
   sSay "" 
41.
   sSay "Um eine Datei zu verschieben:" 
42.
   sSay "Archiv.vbs [Laufwerk:][Pfad]Datei" 
43.
   sSay "" 
44.
   sSay "Um ein Verzeichniss zu verschieben:" 
45.
   sSay "Archiv.vbs [Laufwerk:][Pfad]Verz" 
46.
   sSay "" 
47.
   sSay "[Laufwerk:][Pfad]Datei   Bezeichnet den Pfad und den Namen der zu" 
48.
   sSay "                         archivierenden Datei(en)." 
49.
   sSay "[Laufwerk:][Pfad]Verz    Bezeichnet das zu archivierende Verzeichnis." 
50.
   sSay "" 
51.
   WScript.Sleep 60*5 
52.
   WScript.Quit 
53.
End If 
54.
 
55.
strZielPfad=strArchivPfad & mid(strQuellPfad,4,500) 
56.
 
57.
sSay "strArchivPfad: " & strArchivPfad 
58.
sSay "strQuelle: " & strQuelle 
59.
sSay "strQuellPfad: " & strQuellPfad 
60.
 
61.
sSay "" 
62.
sSay "md " & strZielPfad 
63.
fAusfuehren "cmd.exe /c md " & strZielPfad,"Msg","" 
64.
sSay "" 
65.
sSay "move " & strQuelle & " " & strZielPfad 
66.
fAusfuehren "cmd.exe /c move " & strQuelle & " " & strZielPfad,"Msg","" 
67.
 
68.
   WScript.Sleep 60*50 
69.
 
70.
'########################################################################################### 
71.
'                                 Beginn Sub und Function 
72.
'########################################################################################### 
73.
 
74.
'##### Beginn ASCII2ANSI ##### 
75.
' Wandelt deutsche Zeichen (Umlaute) um 
76.
Function fASCII2ANSI(text) 
77.
Dim temp 
78.
	temp = Replace(text, Chr(132), Chr(228)) 
79.
	temp = Replace(temp, Chr(129), Chr(252)) 
80.
	temp = Replace(temp, Chr(142), Chr(196)) 
81.
	temp = Replace(temp, Chr(154), Chr(220)) 
82.
	temp = Replace(temp, Chr(153), Chr(214)) 
83.
	temp = Replace(temp, Chr(148), Chr(246)) 
84.
	temp = Replace(temp, Chr(225), Chr(223)) 
85.
	fASCII2ANSI = temp 
86.
End Function 
87.
'##### Ende ASCII2ANSI ##### 
88.
 
89.
 '##### Beginn Ausfuehren ##### 
90.
' Ausführen von Programmen oder Betriebssystem-Befehlen 
91.
Function fAusfuehren(strBefehl,strArt,strLogFile) 
92.
  Dim objWshShell 
93.
  Dim objJob 
94.
  Dim strJobErr 
95.
  Dim rc 
96.
  Dim TMP 
97.
 
98.
  strJobErr = "" 
99.
  Set objWshShell = WScript.CreateObject("Wscript.shell") 
100.
  Set objJob = objWshShell.Exec(strBefehl) 
101.
 
102.
  Do While objJob.status = 0 
103.
    TMP = objJob.stderr.readall 
104.
    If TMP <> "" Then 
105.
      strJobErr = strJobErr & fASCII2ANSI(TMP) 
106.
    End If 
107.
  Loop 
108.
  rc = objJob.ExitCode 
109.
 
110.
  If strArt="Log" Then 
111.
    If rc <> 0 Then 
112.
      sWriteLog strLogFile,"""" & strBefehl & """ (RC: " & rc & ")" & vbCRLF & strJobErr 
113.
    Else 
114.
      sWriteLog strLogFile,"Aktion """ & strBefehl & """ erfolgreich abgeschlossen (RC: " & rc & ")" 
115.
    End If 
116.
  ElseIf strArt="Msg" Then 
117.
    If rc <> 0 Then 
118.
      sSay strBefehl & "(RC: " & rc & ")" & vbCRLF & strJobErr 
119.
    Else 
120.
      sSay strBefehl & " erfolgreich abgeschlossen (RC: " & rc & ")" 
121.
    End If  
122.
  End If 
123.
 
124.
  If rc <> 0 Then 
125.
    fAusfuehren = rc 
126.
  Else 
127.
    fAusfuehren = 0 
128.
  End If 
129.
End Function 
130.
'##### Ende Ausfuehren ##### 
131.
 
132.
 '##### Beginn LeftString ##### 
133.
' sucht das letzte Zeichen in einem String und gibt alles vor dem Zeichen aus 
134.
Function fLeftString(String,Trennzeichen) 
135.
On Error Resume Next 
136.
      fLeftString = Left(String,InStrRev(String,Trennzeichen)-1) 
137.
On Error Goto 0 
138.
End Function 
139.
'##### Ende LeftString ##### 
140.
 
141.
 '##### Beginn ChkCScript ##### 
142.
' Prüfung, ob Ausführung über CScript.exe 
143.
Sub sChkCScript() 
144.
If Not InStr(UCase(WScript.FullName), "CSCRIPT") <> 0 Then 
145.
   MsgBox "Ausführung mit CScript erforderlich!" 
146.
   WScript.Quit 
147.
End If 
148.
End Sub 
149.
'##### Ende ChkCScript ##### 
150.
 
151.
 '##### Beginn Say ##### 
152.
' Bildschirmausgabe 
153.
Sub sSay(Msg) 
154.
 Wscript.echo Msg 
155.
End Sub 
156.
'##### Ende Say #####
Hat jemand eine andere Idee? - darf auch CMD oder BAT sein.

Habe auch schon andere Beiträge mir angeschaut Skript um Dateien samt Ordnerstruktur zu verschieben konnte dies aber nicht auf mein Problem übertragen.

Vielen Dank im Voraus.

Mit freundlichen Grüßen
Voigt-Sommer
Mitglied: bastla
18.09.2007 um 00:21 Uhr
Hallo cvoigt!

An sich wäre Batch sicherlich die bessere (oder zumindest einfachere) Sprache für diesen Zweck, aber auch mit reinem VBS sollte sich die Aufgabe lösen lassen:
01.
'========================================================================== 
02.
03.
' NAME: Dateien archivieren 
04.
' VERSION: 0001 
05.
06.
' AUTOR: Christian Voigt-Sommer 
07.
' DATUM: 14.09.2007 
08.
09.
' Funktion:  
10.
'  
11.
'========================================================================== 
12.
' Änderungen:  
13.
'  
14.
'========================================================================== 
15.
 
16.
Option Explicit 
17.
 
18.
DIM fso, args 
19.
DIM strQuelle, strQuellPfad, strZielPfad, strArchivPfad, strFullPath 
20.
DIM aPfad, strTeilPfad 
21.
DIM IsFolder 
22.
DIM sOut 
23.
DIM i 
24.
 
25.
strArchivPfad = "Z:\TEMP" 
26.
 
27.
'sChkCScript() 
28.
 
29.
Set fso = CreateObject("Scripting.FileSystemObject") 
30.
 
31.
Set args = WScript.Arguments 
32.
If args.Count>0 Then 
33.
   strQuelle = args(0) 
34.
   If fso.FolderExists(strQuelle) Then 'Datei oder Ordner? 
35.
      IsFolder = True 
36.
   ElseIf Not fso.FileExists(strQuelle) Then 
37.
      sSay strQuelle & " wurde nicht gefunden." 
38.
	  WScript.Quit 
39.
   End If 
40.
 
41.
   strQuelle = fso.GetAbsolutePathName(strQuelle) 'Vollständigen Pfad verwenden 
42.
 
43.
   If IsFolder Then 
44.
      If Not fso.GetFolder(strQuelle).IsRootFolder Then 
45.
		 strQuellPfad = fso.GetParentFolderName(strQuelle) 
46.
	  Else 
47.
	     strQuellPfad = "" 
48.
	  End If 
49.
   Else 
50.
      strQuellPfad = fso.GetParentFolderName(strQuelle) 
51.
	  strFullPath = strArchivPfad & "\" & Mid(strQuelle, 4) 
52.
   End If 
53.
Else 
54.
   sOut = "Archiviert Dateien in einem vordefiniertem Ordner" & vbCrLF & _ 
55.
   "unter Beibehaltung der Ordnerstuktur" & vbCrLF & _ 
56.
   "" & vbCrLF & _ 
57.
   "Um eine Datei zu verschieben:" & vbCrLF & _ 
58.
   "Archiv.vbs [Laufwerk:][Pfad]Datei" & vbCrLF & _ 
59.
   "" & vbCrLF & _ 
60.
   "Um ein Verzeichniss zu verschieben:" & vbCrLF & _ 
61.
   "Archiv.vbs [Laufwerk:][Pfad]Verz" & vbCrLF & _ 
62.
   "" & vbCrLF & _ 
63.
   "[Laufwerk:][Pfad]Datei" & vbTab & "Bezeichnet den Pfad und den Namen der zu" & vbCrLF & _ 
64.
   vbTab & vbTab & vbTab & "archivierenden Datei(en)." & vbCrLF & _ 
65.
   "[Laufwerk:][Pfad]Verz" & vbTab & "Bezeichnet das zu archivierende Verzeichnis." 
66.
   sSay sOut 
67.
   WScript.Quit 
68.
End If 
69.
 
70.
strZielPfad = strArchivPfad & "\" & Mid(strQuellPfad, 4) 
71.
If Right(strZielPfad, 1) <> "\" Then strZielPfad = strZielPfad & "\" 
72.
 
73.
sOut = "strArchivPfad:" & vbTab & strArchivPfad & vbCrLF & _ 
74.
"strQuelle:  " & vbTab & strQuelle & vbCrLF & _ 
75.
"strQuellPfad:" & vbTab & strQuellPfad & vbCrLF & _ 
76.
"" & vbCrLF & _ 
77.
"Erstelle: " & vbTab & strZielPfad 
78.
sSay sOut 
79.
 
80.
aPfad = Split(strZielPfad, "\") 
81.
strTeilPfad = aPfad(0) 
82.
For i = 1 To UBound(aPfad) 'Zielpfad aufbauen 
83.
   strTeilPfad = strTeilPfad & "\" & aPfad(i) 
84.
   If Not fso.FolderExists(strTeilPfad) Then 
85.
      fso.CreateFolder(strTeilPfad) 
86.
   End If 
87.
Next 
88.
 
89.
sSay vbCrLF & "Verschiebe " & vbTab & strQuelle & vbCrLF & "nach " &vbTab & vbTab & strZielPfad 
90.
If IsFolder Then 
91.
   fso.CopyFolder strQuelle, strZielPfad, True 
92.
   fso.DeleteFolder strQuelle 
93.
Else 
94.
   If fso.FileExists(strFullPath) Then fso.DeleteFile(strFullPath) 
95.
   fso.MoveFile strQuelle, strZielPfad 
96.
End If 
97.
 
98.
'########################################################################################### 
99.
'                                 Beginn Sub und Function 
100.
'########################################################################################### 
101.
 
102.
 '##### Beginn ChkCScript ##### 
103.
' Prüfung, ob Ausführung über CScript.exe 
104.
Sub sChkCScript() 
105.
If Not InStr(UCase(WScript.FullName), "CSCRIPT") <> 0 Then 
106.
   MsgBox "Ausführung mit CScript erforderlich!" 
107.
   WScript.Quit 
108.
End If 
109.
End Sub 
110.
'##### Ende ChkCScript ##### 
111.
 
112.
 '##### Beginn Say ##### 
113.
' Bildschirmausgabe 
114.
Sub sSay(Msg) 
115.
 Wscript.echo Msg 
116.
End Sub 
117.
'##### Ende Say #####
Da keine "Shell"-Befehle verwendet werden (und sich die Ausgaben, falls Du sie tatsächlich benötigst, auch mit MsgBoxes einigermaßen formatieren lassen), sollte als Interpreter nicht unbedingt "cscript.exe" verlangt sein.

Im Vergleich zum "md"-Befehl ist "CreateFolder" auf das schrittweise Erstellen einer Ordnerstruktur beschränkt, daher die Klimmzüge in diesem Teil.
Vielleicht noch der Hinweis, warum es in Deiner Version nicht geklappt hat: Mit "move" kannst Du im Zielverzeichnis bereits existierende Verzeichnisse nicht überschreiben - Du müsstest ein "xcopy /s /y" mit einem "rd /s /q" kombinieren ...

Grüße
bastla
Bitte warten ..
Mitglied: cvoigt
18.09.2007 um 21:32 Uhr
Hallo bastla,

danke für Ihre Antwort. Hätte aber noch Fragen.

Wie würden Sie es mit Batch machen?

Ich habe gestern vor Ihrer Antwort (animiert durch den Beitrag auf den ich verwiesen habe) mal ein bischen mit "for" experimentiert:
01.
Set Archivziel=S:\Archiv 
02.
for /D %%i in (%1) do set Zielpfad=%%~pi 
03.
md "%Archivziel%%Zielpfad%" 2>nul 
04.
move "%1" "%Archivziel%%Zielpfad%" 
05.
pause
Das Ergebnis ist jedoch das gleiche wie in meinem VB-Script (nur kürzer ).

Du müsstest ein "xcopy /s /y" mit einem "rd /s /q" kombinieren ...
Wie sieht dies aus? Ist dass auch Sicher, dass nicht gelöscht wird, obwohl der xcopy irgendwie fehl schlug.
"rd" ist doch nur für Verzeichnisse und nicht für Dateien oder irre ich mich da?
Was ist wenn nur eine einzelne Datei archiviert werden soll?

Mit freundlichen Grüßen
Voigt-Sommer
Bitte warten ..
Mitglied: bastla
19.09.2007 um 00:00 Uhr
Hallo cvoigt!

Analog zur Script-Lösung könnte die Batch-Variante so aussehen:
01.
@echo off 
02.
if not exist %1 goto :eof 
03.
 
04.
set "Archivziel=S:\Archiv" 
05.
set "Pfad=%~p1" 
06.
set "DoV=%~nx1" 
07.
set "ZPfad=%Archivziel%%Pfad%" 
08.
set "Z=%Archivziel%%Pfad%%DoV%" 
09.
 
10.
if not exist "%ZPfad%" md "%ZPfad%" 
11.
 
12.
set V= 
13.
dir "%~1\*.*">nul 2>nul && set V=True 
14.
if defined V ( 
15.
	echo Verzeichnis "%DoV%" wird verschoben nach: 
16.
	echo %ZPfad% 
17.
	echo. 
18.
	xcopy /s /e /i /y "%~1\*.*" "%Z%" >nul && rd /s /q %1 
19.
) else ( 
20.
	echo Datei "%DoV%" wird verschoben nach: 
21.
	echo %ZPfad% 
22.
	echo. 
23.
	move %1 "%Z%" 
24.
)  
25.
pause
Die Unterscheidung zwischen Datei und Verzeichnis ist erforderlich, da nur für Dateien der "move"-Befehl zum gewünschten Ergebnis führt.

Für Verzeichnisse wird, wie schon kurz angedeutet, zunächst der Inhalt (inkl der Unterverzeichnisse) kopiert und, falls der Kopiervorgang ohne Fehler beendet wurde (zur Berücksichtigung dieser Bedingung wird die Verknüpfung der beiden Befehle mit "&&" vorgenommen), das gesamte Verzeichnis (und damit natürlich auch die darin enthaltenen Dateien und Unterverzeichnisse) gelöscht.
Um Ihrer etwaigen Frage nach der Zeile
01.
dir "%~1\*.*">nul 2>nul && set V=True
zuvorzukommen :

Der "dir"-Befehl mit zusätzlichem "\*.*" führt bei Anwendung auf ein existierendes Verzeichnis (auch wenn dieses leer ist) zu einer gültigen Ausgabe, während für eine Datei ein Fehler auftritt.

Mit dem oben erwähnten Verknüpfungsoperator "&&" wird bei Beendigung des "dir"-Befehles ohne Fehler der Variablen %V% (welche vorher mit "set V=" gelöscht worden war) ein Wert zugewiesen.

Der Wert selbst ist nicht von Belang, aber die Tatsache, dass die Variable %V% überhaupt einen Wert enthält (und damit "definiert" ist), wird in der nächsten Zeile zur Feststellung der "Verzeichnis-Eigenschaft" des übergebenen Parameters eingesetzt.

Da die Ausgabe des "dir"-Befehles, egal ob mit oder ohne Fehler, nicht interessiert, wird sie für beide Fälle nach "nul" umgeleitet. Ganz exakt wäre die Schreibweise dafür eigentlich "1>nul 2>nul", wobei "2>nul" für das Unterdrücken einer ev Fehlermeldung sorgt.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

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

(1)

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

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...