Jump to content

WSH: Datei blockweise kopieren


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo allseits,

 

ich suche mir seit Stunden die Finger wund nach einem Ansatz, eine triviale Aufgabenstellung mit Hilfe des WSH zu lösen: ich muss sehr große Dateien kopieren (2 GB und mehr ...), das dauert nun mal seine Zeit, und manchmal verlieren die Benutzer die Geduld und brechen das Script ab. gesucht ist eine Möglichkeit der Fortschrittsanzeige.

 

Zwei Standardmethoden gäbe es:

 

* Die Windows Api Funktion CopyFileEx hat eine Callback-Prozedur, die nach jedem 64k Block aufgerufen wird. Aber dummerweise konnte ich kein Objekt finden, welches CopyFileEx kapselt, und der WSH kann bekanntlich keine APIs aufrufen --> dead end. Eventuell gibt es aber doch irgendein brauchbares Objekt?

 

* Die Datei binär blockweise lesen und schreiben. Das scheint dem WSH auch nicht gegeben, jedenfalls konnte ich nichts dazu finden, auch das dazu grundlegend notwendige "Array of Byte" scheint ihn zu überfordern. Das Ganze soll aber eventuell mit Hlife von ADODB.stream möglich sein, aber dazu habe ich nur Fragmente an Information gefunden, und da war wenig dabei was Sinn gemacht hätte.

 

Hat jemand eine brauchbare WSH (Cscript) Lösung für den einen oder den anderen Ansatz?

 

Thx

 

Armin

bearbeitet von Nimral
Tippfelher eliminiert
Link zu diesem Kommentar

Hallo,

 

die Anzeige für den Fortschritt der Aktion ist schon inklusive, wenn Du zum Kopieren das Folder Objekt benutzt. Es hat dazu die Methode Copyhere.

 

Ein ganz einfaches Beispiel:

 

function kopieren (quelle, ziel)
   dim objShell
   dim objFolder
   set objShell = CreateObject("Shell.Application")
   set objFolder = objShell.NameSpace(ziel)

   if not objFolder is nothing then
       objFolder.CopyHere(quelle)
   else 
       MsgBox("Fehler")
   end if

   set objShell = nothing
   set objFolder = nothing
end function

 

Der Aufruf sieht beispielsweise so aus

kopieren "C:\" , "D:\"

 

Grüße,

 

Sigma

Link zu diesem Kommentar
Hallo,

 

die Anzeige für den Fortschritt der Aktion ist schon inklusive, wenn Du zum Kopieren das Folder Objekt benutzt. Es hat dazu die Methode Copyhere.

 

...

Sigma

 

Das ist ein Ansatz, der gut klappt, vielen Dank! Trotzdem im Moment "nur" Plan B: das restliche Script basiert auf Kommandozeilen-Ausgaben, und mir wäre eine Fortschrittsanzeige per Konsole lieber - weils halte einheitlicher ausschaut. Mal sehen, ob nicht doch jemand blockweises Kopieren per Stream.Read/Stream.Write in den Griff bekommen hat (APIs aufrufen gebe ich wenig Chancen). Möglicherweise hat auch jemand einen com Helper für WMI gebastelt der das kann - wäre allerdings Plan C wegen vorhersehbarer Copyright- und Installationsprobleme.

 

Mal sehen ob da noch was kommt ... Du hats mir aber bereits einen sehr brauchbaren Plan B in die Hand gegeben, vielen Dank!

 

Armin.

Link zu diesem Kommentar
Powershell kennt eine Fortschrittsanzeige, welche man für ein Script nutzen kann.

 

Sorry, habs nicht erwähnt: Zielplattform ist XP/ Windows 2003 Server. Installation der Powershell ist nicht vorgesehen, und selbst wenn, ich müsste dann das ganze Script auf Powershell neu schreiben. Wenn ich diese Alternative erwägen würde ... dann würde ich gleich eine "richtige" Programmiersprache verwenden, und nicht die Powershell.

 

Danke trotzdem für die info

 

Armin.

Link zu diesem Kommentar
robocopy ist doch das Tool der Wahl für grössere Kopieraktionen. Kann man zur Not auch aus dem WSH aufrufen

 

blub

 

Keine Workarounds in Form externer Tools wenn es nicht sein muss. Ich soll mit dem auskommen was XP/2003 out of the box bieten.

 

Außerdem bin ich recht wenig begeistert vom Einbinden externer Tools, die Resultate sehen idR eher "zusammengestiefelt" aus, und man hat wenig bis gar keine Kontrolle über das externe Programm, bis es dann irgendwann netter Weise wieder zurückkommt - oder auch nicht - und dann bekommt man wenn überhaupt nur einen ErrorConde in die Hand.

 

Deshalb wäre der blockweise Kopierer mein absoluter Favorit. Alle 64k bekäme ich die Kontrolle wieder in die Hand.

 

Armin.

Link zu diesem Kommentar
Hallo,

 

...

objFolder.CopyHere(quelle)

...

 

Hi Sigma, meine Begeisterung ist inzwischen gegen null gesunken: CopyHere gibt offenbar keinerlei Fehlercode zurück! Damit ist dieser Filecopy ein Schuss ins Dunkle, und für das Automatisieren von Abläufen leider unbrauchbar.

 

Wäre zu schön gewesen, aber mal sehen, eventuell bekomme ich ja doch noch Plan A zum laufen .-)

 

Armin.

Link zu diesem Kommentar
Hallo,

 

 

 

Da kann kein Fehlercode kommen. Der Kopiervorgang läuft asynchron. Sonst würde allein der Fortschrittsdialog alles blockieren.

 

Grüße,

 

Sigma

 

Nope. Nach Aufruf von CopyHere wartet das Script brav, bis der copy beendet ist.

 

Hab jetzt einen Workaround gebastelt: schaue nach, ob das Zielfile schon vorhanden ist, wenn ja, lösche es, dann mach CopyHere und schau nochmal nach, ob es nun vorhanden ist. Wenn ja --> alles OK, wenn nein --> irgendein Fehler muss wohl aufgetreten sein.

 

Mit dem Block-Copy scheine ich unter WSH kein Glück zu haben :( Habe inzwischen eine "Lösung" gefunden, das Array of Byte mit einem String nachzubilden, das Ganze ist allerdings wegen des enormen Overheads bei jedem eizelnen Byte so grottenlahm, dass ich es gleich wieder gelöscht habe.

 

Armin.

Link zu diesem Kommentar
Robocopy ist ein Tool aus dem MS-ResourceKit. Schaus dir wenigstens mal an.

 

wenn du dieses Rad ein zweites Mal erfinden sollst, noch dazu mit dem WSH, ist das -sei mir nicht böse- Beschäftigungstherapie für die Rundablage.

 

Keine Angst, Robocopy gehört auch in meiner Toolbox zum Standard, wenn ich mal wieder in die Niederungen von Batches abtauchen muss.

 

Im vorliegenden Fall ist WSH per Vorgabe gesetzt, warum ich Shell-Aufrufe für drittklassige Lösungen halte habe ich begründet (Du magst jetzt einwenen, dass CopyHere auch nichts anderes ist, sogar dümmer als Robocopy, der würde mir immerhin einen Errorlevel melden wenn ihm was nicht passt, während CopyHere auf toter Mann macht - ich würde Dir recht geben, aber in diesem Fall gebe ich "ist im Standardlieferumfang mit eingebaut" höhere Priorität) und ich bin ein sturer Hund und möchte das Ganze so haben wie ich es haben will.

 

Danke trotdzem, und Robocopy ist ein gutes Tool,

 

Armin.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...