Nimral 12 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 (bearbeitet) 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 7. Februar 2011 von Nimral Tippfelher eliminiert Zitieren Link zu diesem Kommentar
Sigma 10 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 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 Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 7. Februar 2011 Autor Melden Teilen Geschrieben 7. Februar 2011 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. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 Powershell kennt eine Fortschrittsanzeige, welche man für ein Script nutzen kann. Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 robocopy ist doch das Tool der Wahl für grössere Kopieraktionen. Kann man zur Not auch aus dem WSH aufrufen blub Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 7. Februar 2011 Autor Melden Teilen Geschrieben 7. Februar 2011 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. Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 7. Februar 2011 Autor Melden Teilen Geschrieben 7. Februar 2011 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. Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 7. Februar 2011 Autor Melden Teilen Geschrieben 7. Februar 2011 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. Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 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. Zitieren Link zu diesem Kommentar
Sigma 10 Geschrieben 7. Februar 2011 Melden Teilen Geschrieben 7. Februar 2011 Hallo, Hi Sigma, meine Begeisterung ist inzwischen gegen null gesunken: CopyHere gibt offenbar keinerlei Fehlercode zurück! Da kann kein Fehlercode kommen. Der Kopiervorgang läuft asynchron. Sonst würde allein der Fortschrittsdialog alles blockieren. Grüße, Sigma Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 8. Februar 2011 Autor Melden Teilen Geschrieben 8. Februar 2011 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. Zitieren Link zu diesem Kommentar
Nimral 12 Geschrieben 9. Februar 2011 Autor Melden Teilen Geschrieben 9. Februar 2011 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. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.