nina1985
Goto Top

VBSkript umschreiben, um eine Datei zu kopieren (absoluter Anfänger!)

Hallo zusammen,

ich bin heute von meinem Chef im Praktikum ins kalte Wasser geschmissen worden und soll so schnell wie möglich eine .vbs-Datei umschreiben (bzw. neu erstellen, aber das kann ich erst recht nicht). Die alte Datei existiert und sieht wie folgt aus:

'v4.7
' File: ed-sichern.vbs
'

'Option Explicit

Dim fso, Datei
Dim Dateiquelle, Pfadneu, Pfadtest, Dateiziel, ZielVerz, Verzeichnis
Dim nCount
Dim oFSO
Dim oFolder
Set ofso = WScript.CreateObject("Scripting.FileSystemObject")

Set oFolder = oFSO.GetFolder("F:\eDonkey down")

' Anzahl Dateien im Stammverzeichnis von C:

nCount = oFolder.Files.Count

Set fso = WScript.CreateObject("Scripting.FileSystemObject")

'#########################################################################################
' Ausgangsverzeichnis ########### anpassen auf das ED-Verzeichnis ########################
Set Verzeichnis = FSO.GetFolder("F:\eDonkey down")
'#########################################################################################

'##########################################################################################
'Zielverzeichnis' ################# anpassen auf das Zielverzeichnis ######################
Pfadneu = "F:\save\" & Datumzeit & "\"
'##########################################################################################
fso.createfolder(Pfadneu)
Set Zielverz = FSO.Getfolder(Pfadneu)'Set Zielverz = FSO.Getfolder(Pfadtest)

For Each Datei In Verzeichnis.Files
on error resume next
Set DateiQuelle = fso.GetFile(Datei)
fso.moveFile DateiQuelle, Zielverz & "\"
Next

WScript.Quit


'
Function DatumZeit
'

' gibt ein Zeichenfolge zurück, die Datum / Zeit enthält
' und als Dateiname / Verzeichnisnae verwendet werden kann

Dim Zeit

Zeit = now()

' zweistellige Jahreszahl
DatumZeit = Right(Year(Zeit),2)

' zweistellige Monatszahl
If Len(Month(Zeit)) = 1 then DatumZeit = DatumZeit & "-0" & Month(Zeit)
If not Len(Month(Zeit)) = 1 then DatumZeit = DatumZeit & "-" & Month(Zeit)

' zweistellige Tageszahl
If Len(Day(Zeit)) = 1 then DatumZeit = DatumZeit & "-0" & Day(Zeit)
If not Len(Day(Zeit)) = 1 then DatumZeit = DatumZeit & "-" & Day(Zeit)

' zweistellige Stundezahl
If Len(Hour(Zeit)) = 1 then DatumZeit = DatumZeit & "_0" & Hour(Zeit)
If not Len(Hour(Zeit)) = 1 then DatumZeit = DatumZeit & "_" & Hour(Zeit)

' zweistellige Minutenzahl
If Len(Minute(Zeit)) = 1 then DatumZeit = DatumZeit & "'0" & Minute(Zeit)
If not Len(Minute(Zeit)) = 1 then DatumZeit = DatumZeit & "'" & Minute(Zeit)

' zweistellige Sekundenzahl
If Len(Second(Zeit)) = 1 then DatumZeit = DatumZeit & "'0" & Second(Zeit)
If not Len(Second(Zeit)) = 1 then DatumZeit = DatumZeit & "'" & Second(Zeit)

End Function ' DatumZeit
' **

Allerdings funktioniert sie nicht, obwohl die Verzeichnisse existieren. Ich bin jetzt gerade mal so weit gekommen, dass ich verstanden habe, dass die Zeilen, an deren Anfang ein ' steht, Kommentare sind. Ich habe noch nie mit VB gearbeitet und auch sonst von Programmierung keine Ahnung.

Es wird jetzt gewünscht, dass eine Datei "D:\draw\test.jpg" (als Beispiel) in ein Unterverzeichnis "D:\draw\backup" kopiert wird und zwar als "test_datumzeit.jpg", wobei datumzeit aktuelle Werte sein sollen. Angeblich ist das ganz einfach, aber bis jetzt hat meine Recherche im Internet bzw. auch in einem Buch mich nicht wirklich weitergebracht. Ich habe gehofft, dass hier evtl. jemand ist, für den das Ganze kein Problem darstellt. Am besten wäre natürlich, wenn er dabei noch ein bisschen erklären könnte, aber wenn ich erst mal einen Lösungsvorschlag hätte, würde mir das auch schon weiterhelfen. Der Unterschied ist ja erstens mal, dass das Ding da oben einen Ordner kopiert und keine Datei. Aber ich weiß wirklich nicht, wo ich da eingreifen soll.

Danke schon mal im Voraus!
Nina

Content-Key: 39707

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

Printed on: April 19, 2024 at 08:04 o'clock

Member: Biber
Biber Sep 08, 2006 at 16:37:18 (UTC)
Goto Top
Moin Nina1985,

willkommen im Forum.

Wichtigste Regel beim Programmieren:
Erstmal die Tastatur aus der Hand legen und sortieren.
Wo will ich hin, was hab ich an Informationen, welche brauche ich noch, welche kann ich mir schrittweise besorgen?
Du hast schon ganz gut angefangen:
Unsortierte Informationen/Hoffnungen/Vermutungen/Wünsche:
Es wird jetzt gewünscht, dass eine Datei "D:\draw\test.jpg" (als Beispiel) in ein >Unterverzeichnis "D:\draw\backup"
kopiert wird und zwar als "test_datumzeit.jpg", wobei datumzeit aktuelle Werte sein sollen. Angeblich ist das ganz
einfach, aber bis jetzt hat meine Recherche im Internet bzw. auch in einem Buch mich nicht wirklich weitergebracht. Ich
habe gehofft, dass hier evtl. jemand ist, für den das Ganze kein Problem darstellt.

So, jetzt lass uns da mal die Luft aus dem Käse drücken, die Vermutungen rausstreichen und dafür ein paar Rückfragen machen:
- eine Datei "D:\draw\test.jpg" (als Beispiel) in ein >Unterverzeichnis "D:\draw\backup" kopiert wird
Wie bekommt das Programm das mit?
Welche Infos muss das Programm bekommen, um eine Datei von A nach B zu kopieren?
Muss ich vorsehen, dass auch alle *.mp3-Dateien kopiert werden sollen oder ist es IMMER exakt eine?
Was soll passieren, wenn die Quelldatei nicht gefunden wird?
Was, wenn es den Zielordner nicht gibt?
Was, wenn die Zieldatei schon vorhanden ist?
Was, wenn die nicht auf das Laufwerk passt?
Fehler auf den Bildschirm? Oder in eine Logdatei?
Und Erfolgsmeldungen?

- und zwar als "test_datumzeit.jpg",
Na ja.. wie sieht denn Datumzeit aus? JJJJMMTT_hhmm? Oder mit Sekunden? Was ist sinnvoll?
- wobei datumzeit aktuelle Werte sein sollen.
Was heißt "aktuell" ? Wenn ich drei Videos kopiere, sollen dann alle die Uhrzeit des Programm-Starts bekommen oder jede Datei die Uhrzeit des jeweiligen Kopie-Starts?
Angeblich ist das ganz einfach, aber bis jetzt hat meine Recherche im Internet bzw. auch in einem Buch mich nicht
wirklich weitergebracht. Ich habe gehofft, dass hier evtl. jemand ist, für den das Ganze kein Problem darstellt.


Du siehst, das Programm nimmt schon bei diesen Vorüberlegungen Gestalt an, ohne dass Du auch nur eine Zeile coden musst.

Versuch mal bitte, die Fragen zu beantworten (die Antworten musst zum Teil Du geben als Programmierer - der Kunde kann und will sich da gar nicht reindenken).

Wenn wir das "Wie soll es aussehen?" wissen, dann können wir zum Handwerklichen übergehen.

Gruß
Biber
Member: Nina1985
Nina1985 Sep 08, 2006 at 17:23:55 (UTC)
Goto Top
Hallo Biber,

erst mal vielen, vielen Dank für diese nette, ausführliche Antwort! Ich bin froh, dass es anscheinend wirklich Menschen gibt, die sich noch an die Stelle eines Anfängers denken können und einen nicht mit einer Antwort konfrontieren, die man aufgrund fehlender Vorkenntnisse nicht versteht. Bis jetzt habe ich bei sowas immer eher schlechte Erfahrungen gemacht, also vielen Dank noch mal. Ich werde jetzt mal versuchen, die Fragen, die du gestellt hast, zu beantworten.

Wie bekommt das Programm das mit?
Jaaa, das würde ich auch gerne wissen face-wink. Sorry, aber an der Stelle "hakt" es bei mir schon. Wenn ich mit der Beispiel-Datei vergleiche, dann nehme ich an, dass die Befehle "Create Object" und "Get Folder" etwas damit zu tun haben, aber wie das Programm das jetzt wirklich mitbekommt, weiß ich nicht. Ich muss auch gestehen, dass mir die ganzen Sachen ganz oben, vor denen jeweils "Dim" steht, nichts sagen.

Welche Infos muss das Programm bekommen, um
eine Datei von A nach B zu kopieren?
So, das kann ich versuchen: Es muss erstens wissen, wo A ist, zweitens, wie die Datei heißt, es muss die Info bekommen, dass es kopieren soll und es muss wissen, wo B ist. Das wäre so meinen naiven Ideen dazu face-wink.

Muss ich vorsehen, dass auch alle *.mp3-Dateien kopiert werden sollen oder ist es IMMER exakt eine?
Da hast du mich jetzt verwirrt, meintest du .jpg-Dateien, die ich ja als Beispiel angegeben hatte oder hast du dich da auf das Beispiel-Skript bezogen? Es geht immer um eine Datei und zwar jedes Mal die gleiche. Wenn ich es richtig verstanden habe, wird mit dieser Datei die ganze Zeit gearbeitet, d. h., sie verändert sich und man möchte sozusagen "im Hintegrund" ein Skript, das die Datei kopiert, falls irgendwas schief geht.

Was soll passieren, wenn die Quelldatei nicht gefunden wird?
Da bin ich überfragt, kann man davon ausgehen, dass das nicht stattfindet? face-smile Wenn nicht und sie wird nicht gefunden, dann soll am besten gar nichts passieren.

Was, wenn es den Zielordner nicht gibt?
Kann man ihn dann erstellen lassen?

Was, wenn die Zieldatei schon vorhanden ist?
Da bin ich jetzt davon ausgegangen, dass das nicht sein kann, da ja durch die Datums- und Zeitangaben ein jeweils anderer Name gewährt ist, wenn man davon ausgeht, dass nicht mehrmals pro Minute kopiert wird.

Was, wenn die nicht auf das Laufwerk passt?
Da bin ich auch überfragt, ich denke, das passiert nicht, aber wenn doch... Hm, dann würde ich mal sagen, soll am besten auch gar nichts kopiert werden.

Fehler auf den Bildschirm? Oder in eine Logdatei?
Ach so, oder gehörte das noch zu der Frage obendrüber? Dann wäre ein Fehler auf dem Bildschirm gut. Aber muss das da rein? Oder kann man darüber auch einfach gar keine Infos angeben?

Und Erfolgsmeldungen?
Nein, sollen nicht angezeigt werden.

> - und zwar als "test_datumzeit.jpg",
Na ja.. wie sieht denn Datumzeit aus? JJJJMMTT_hhmm? Oder mit Sekunden? Was ist sinnvoll?
JJJMMTT_hhmm klingt gut. (20060908_1920 wäre dann ein Beispiel? Ich denke mal, das kann man zur Not auch hinterher noch anpassen, oder?)

> - wobei datumzeit aktuelle Werte sein sollen.
Was heißt "aktuell" ? Wenn ich drei Videos kopiere, sollen dann alle die Uhrzeit des Programm-Starts bekommen oder jede Datei die Uhrzeit des jeweiligen Kopie-Starts?
Aktuell heißt (und da muss ich jetzt auch raten, wie es in dem konkreten Fall am besten wäre) wahrscheinlich am ehesten die Uhrzeit des Kopie-Starts und da es sich wie gesagt immer nur um eine Datei handelt, dürfte das dann ja einfacher werden.

So, ich hoffe, das hat etwas Licht in die Sache gebracht face-smile. Vielen Dank und noch mal und ich würde mich auf die "handwerkliche" Hilfe freuen!

Nina
Member: Biber
Biber Sep 08, 2006 at 23:59:03 (UTC)
Goto Top
Na gut, Nina,

dann tasten wir uns mal weiter heran an die Anforderung...
Ich hab mal eine erste Rohfassung zusammengeschreddert, an und mit der man/frau jetzt ein bisschen spielen und feilen könnte.

Und ich habe ein paar schöne Suchbegriffe im Source versteckt, zu denen sich viele Detailinfos finden lassen im Netz.
Insbesondere empfehle ich, die Suchmaschine Deines Vertrauens zu befragen nach "FileSystemObject Syntax" und "WScript.Arguments".
Einige andere Funktiönchen, die in Source verwendet werden, sind so banal, wie es der Funktionsname in stililiertem Englisch vermuten lässt.
Zum Beispiel solche Sachen wie Minute(), Hour() oder Left()/Right() ... dass sind halt einfache Funktionen, die es in jeder Skript- oder Programmiersprache vorgefertigt gibt. Was diese Funktionen machen, lässt sich unschwer erraten... face-wink

' --------snipp copyStamped.vbs Vers. 001 (mit kleinen Fehlern!)  
' !!! Aufruf zumindest beim Testen vom CMD-Prompt:   
' !!!  cscript //nologo copyStamped.vbs sourceFile targetFolder  
' --- später auch so:  
' copyStamped.vbs [lw:\path\]sourceFile targetFolder  
Option Explicit 'Tippfehler vermeiden - nur deklarierte Variablen verwenden  

' wir schreiben in VBSkript... also benennen wir auch Variablen englisch  
' oXXX.. wenn es um Objects geht.. strYYY, wenn es um Strings geht  
Dim oFSO, oFile, strFileName, strNewStampedFilename, strFldrName

' Wir brauchen 2 Parameter (sourceFile und targetFolder) zwingend-   
' Sonst brauchen wir nicht anfangen- Also müssen zwei Argumente da sein.  
' In VBS heißen die wscript.arguments(n) von 0 bis wscript.arguments.count  
If wscript.arguments.count() < 2 then ' weniger als 2 Parameter? Dann Feierabend  
   wscript.echo "Fehler: Parameter fehlt. Aufruf: copyStamped [path:\]sourceFile.ext targetFolder"  
   wscript.quit(4) 'Raus mit Errorlevel 4 => soll bedeuten: "Parameterfehler"  
end if

' "einfache" Variablentypen wie Strings und numerische Werte mit [ var=wert] zuweisen  
strFileName = wscript.arguments(0) 'voller Quell-Dateiname ist Parameter 1  
strFldrName = wscript.arguments(1) 'Ziel-Ordner ist in Parameter 2 übergeben  

' "nicht so einfache" Variablentypen wie Objects werden mit "Set oXXX = ..." instanziert  
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")  

If not oFSO.FileExists(strFileName) then  ' existiert die angegebene Datei?  
   wscript.echo "Fehler: Datei " & strFileName & " nicht gefunden."  
   wscript.quit(2) 'Raus mit Errorlevel 2 => Soll bedeuten: Quelldatei nicht gefunden   
End if   

If not oFSO.FolderExists(strFldrName) then  ' existiert der angegebene Zielordner?  
   ' Anmerkung: In der Version 0.02 könne wir auch den Zielordner bei Bedarf anlegen  
   ' dann würde jetzt folgen: oFSO.CreateFolder(strFldrName) ... heben wir auf für später  
   ' jetzt behaupten wir: Zielordner MUSS da sein.  
   wscript.echo "Fehler: Zielordner " & strFldrName & " nicht gefunden."  
   wscript.quit(2) 'Raus mit Errorlevel 3 => Soll bedeuten: Zielordner nicht gefunden   
End if   
      
Set oFile=oFSO.GetFile(strFileName)
strNewStampedFileName = oFSO.GetBaseName(strFilename) & "_" & DatumZeit &  right(strFilename,4)   
On error resume next
oFile.Copy strFldrName & "\" & strNewStampedFileName   
If oFSO.FileExist(strFldrName & "\" & strNewStampedFileName) then  
   wscript.echo "Neuer Dateiname: " & strNewStampedFileName  
End if
WScript.Quit

' ------------------------------------   
Function DatumZeit 
'   
' gibt eine Zeichenfolge zurück, die Datum / Zeit enthält  
' und als Dateiname / Verzeichnisnae verwendet werden kann  

Dim Zeit
Zeit = now() 
' wir wollen "JJJJMMTT_hhmm" ...also erstmal: vierstellige Jahreszahl   
DatumZeit = Right(Year(Zeit),4) 
' ....danach zweistellige Monatszahl   
If Len(Month(Zeit)) = 1 then DatumZeit = DatumZeit & "0"   
DatumZeit = DatumZeit & Month(Zeit) 
' ... dann zweistellige Tageszahl   
If Len(Day(Zeit)) = 1 then DatumZeit = DatumZeit & "0"   
DatumZeit = DatumZeit & Day(Zeit) & "_"  ' den Trenner "_" gleich dazu..  
' ... jetzt zweistellige Stundenzahl  
If Len(Hour(Zeit)) = 1 then DatumZeit = DatumZeit & "0"  
DatumZeit = DatumZeit & Hour(Zeit) 
' zweistellige Minutenzahl   
If Len(Minute(Zeit)) = 1 then DatumZeit = DatumZeit & "0" & Minute(Zeit)   
DatumZeit = DatumZeit & Minute(Zeit) 
End Function ' DatumZeit   
' **  
' ---- snapp copyStamped.vbs  

So, dann hast Du am Wochenende was zum Spielen...
Beispielaufruf am CMD-Prompt:
$cmd$cscript //nologo copystamped.vbs z:\autoruns.chm z:\save
Neuer Dateiname: autoruns_20060909_0142.chm

Viel Spaß
Biber
Member: Atti58
Atti58 Sep 09, 2006 at 08:42:34 (UTC)
Goto Top
@Biber:

Du bist einfach der Beste face-wink ...

Gruß

Atti