Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: cvoigt

cvoigt (Level 1) - Jetzt verbinden

17.09.2007, aktualisiert 19.09.2007, 3523 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.

MfG
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?

MfG
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 ..
Ähnliche Inhalte
Debian
Bash-Skript: Datei einlesen
gelöst Frage von Fenris14Debian3 Kommentare

Moin, also entweder bin ich zu dumm oder ich denke zu kompliziert. Ich versuche ein Skript zu schreiben das ...

VB for Applications
VB Skript Excel Datei
gelöst Frage von FragerVB for Applications3 Kommentare

Hallo Zusammen, Ich brauche eure Hilfe. Ich habe eine Datei 1.xlsx nun brauche ich ein Skript, was die Datei ...

Windows 8
SendTo unter Windows 8 erweitern
Tipp von holli.zimmiWindows 84 Kommentare

Hier ein kleiner Tipp, wie man das "SendTo" bzw. "Senden an" unter Windows 8 erweitert. Um sein "Senden an" ...

XML
XML Datei per Skript ändern
gelöst Frage von chrisenXML12 Kommentare

Hallo zusammen, ich habe eine Frage zur automatischen Konvertierung einer XML Datei. Und zwar: Wir bekommen aus unserem Warenwirtschaftssystem ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 4 TagenHumor (lol)6 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 4 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 8 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 8 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Samba
Windows 10 Client in Samba-Domäne hinzufügen scheitert
Frage von diwaffmSamba29 Kommentare

Hi Leute, ich habe einen Samba Server in der Version 4.9.3 auf einer OpenSuse Maschine laufen. Damit sind momentan ...

Windows Server
Kleine Umfrage: Windows Server Desktop oder Core?
Frage von doomfreakWindows Server22 Kommentare

Hey :) Ich wollte mal eine kleine Umfrage hier starten. Ich bin schon etwas länger auf dieser Seite hier ...

Batch & Shell
CMD-Fenster nach Task schließen
gelöst Frage von Hyperlink.93Batch & Shell16 Kommentare

Hallo, ich habe ein Skript was über einen Task bei jeder User Anmeldung läuft. Der Task startet eine CMD ...