Frage zu Batch Schleifen

Hallo,

ich wühle schon den halben Tag in Tutorials und Foren rum und komme einfach nicht weiter. *jammer, jammer*

Ich möchte gerne automatisiert mehrere (50) Dateien hin und her kopieren.

Das blöde is jetzt, Schleifen kennen maximal neun Durchgänge und für das anfang/ende Konstrukt braucht es eine zweite Datei und Paramter. Eigentlich nicht weiter tragisch, aber ich komme mit dem Aufruf respektive der dann folgenden Abarbeitung nicht hin.

Ich muss mich, wie bereits erwähnt, um 50 Dateien kümmern, und habe keine Lust, die alle paar Tage manuell an hunderten Rechnern hin und her zu wuchten.
*wieder rumjammer*

Nu stehe ich also da mit meinen 50 Parametern
%1=„PfadundDateiname1“

%50=„PfadundDateiname50“

per Schleife soll das jetzt an die eigentliche Abarbeitung geschickt werden:

anfang

IF „%1“=="" GOTO ende
CALL %PfadZurVerarbeitungsbatch% %1
SHIFT
GOTO anfang

ende

Die Abarbeitung macht folgendes:

REM Fullname in Pfad- und Dateinamen trennen
for %%i in ("%1") do set sPATH=%%~di%%~pi
for %%i in ("%1") do set sFILE=%%~ni%%~xi
REM Pfadangaben der Dateien prüfen
SET Path=%sPath:"=%
REM SET Path=%Path: =%
IF NOT EXIST %Path% MKDIR %Path% >> %LOG%
echo. >> %Log%

REM Dateien in der korrekten Version zur Verfügung stellen
SET File=%sFile:"=%
REM SET File=%File: =%

echo %File% >> %LOG%

SET src=%Ref%%File%
SET tgt=%Path%%File%

xcopy /r /y %src% %tgt% >> %LOG%

%Log% beinhaltet Pfad und Dateiname einer Log-Datei.

Anstatt jetzt aber das Zeugs hin und her zu kopieren, will die Batch die Datei öffnen und meldet anschließend die Datei kann nicht geöffnet werde, weil im externen Zugriff.

Kann mir da jemand nen Tip geben, wie das funktioniert?

DANKE

Hob

PS: Dieser Artikel ist auch unter http://www.antonis.de/ im MS-DOS-Forum gepostet, hat da aber leider keine Rückmeldung ergeben.

Frage zu Batch-Schleifen
Hallo Hob,

da hilft es ein wenig, wenn man in den grauen Zellen nach der Syntax kramt.

Du kannst in Batchdateien mit Platzhaltern eine Menge bewirken, z. B. um Dateien umzubenennen:

rename Kopie*.txt *.doc

Das könntest Du auf Dein Kopierproblem übertragen.

HTH
Thomas

Hallo Thomas,

danke für die Rückmeldung. Leider habe ich keine Ahnung, was ich gemäß deiner Idee jetzt tun muss :smile:

VG

Hob

Hallo,

Auch Hallo

ich wühle schon den halben Tag in Tutorials und Foren rum und
komme einfach nicht weiter. *jammer, jammer*

Ich möchte gerne automatisiert mehrere (50) Dateien hin und
her kopieren.

Nu stehe ich also da mit meinen 50 Parametern
%1=„PfadundDateiname1“

%50=„PfadundDateiname50“

per Schleife soll das jetzt an die eigentliche Abarbeitung
geschickt werden:

anfang

IF „%1“=="" GOTO ende
CALL %PfadZurVerarbeitungsbatch% %1
SHIFT
GOTO anfang

ende

Wie wäre es denn statt dessen mit so etwas:?

for %%a in (%\*) do CALL %PfadZurVerarbeitungsbatch% %%a

Gruß, Andreas

danke für die Rückmeldung. Leider habe ich keine Ahnung, was
ich gemäß deiner Idee jetzt tun muss :smile:

Hallo Hob,

wie wäre es mit VBS? Oder hast du Word oder Excel, dann kann man VBA nehmen?

Gruß
Reinhard

Hallo Hob,

die Idee ist folgende:

Du schreibst, z. B. mit Notepad, Folgendes in eine Textdatei:

copy c:\temp\test*.doc c:\Temp\test\Zielverzeichnis*.*

und benennst diese Datei Kopieren.cmd.

Beim Doppelklick auf diese Datei werden alle *.doc-Dateien aus
c:\temp\test kopiert nach
c:\temp\test\Zielverzeichnis

Es liegt an Dir, ob Du mittels Parametern das Ganze flexibel gestaltest.

Gruß
Thomas

Hallo Hob,

vielleicht habe ich Dein Problem nicht verstanden, ich weiss auch nicht, welche Datei die Batch jetzt öffnet statt kopiert. Zu den 50…, Warum schreibst Du diese nicht direkt in die .bat? Also

CALL %PfadZurVerarbeitungsbatch% „PfadundDateiname1“
CALL %PfadZurVerarbeitungsbatch% „PfadundDateiname2“
CALL %PfadZurVerarbeitungsbatch% „PfadundDateiname3“

ggf. kannst Du diese Datei auch automatisiert erstellen, wenn klar ist, wer die 50 Namen wie liefert.

Gruß und viel Erfolg,

achim

Hallo Thomas,

war länger dienstlich unterwegs und kann deshalb erst heute zurückschreiben.

Wie Batch-Dateien grundsätzlich funktionieren weis ich, nur den .* Ansatz versteh ich nicht.

Die Dateien liegen alle in einem Quellverzeichnis, haben aber unterschiedliche Zielverzeichnisse. Ggf. existiert das Zielverzeichnis
noch nicht und muss erstellt werden. Deswegen irritiert mich
der Vorschlag mit *.* copy paste zu arbeiten.

Das Auslesen des Quellverzeichnisses funktioniert, die Ordnererstellung, soweit nicht vorhanden ebenfalls.

Will ich aber die Dateien hin und her kopieren, versucht die Batch sie zu öffnen und meint dann altgescheit kopieren ist nicht möglich, da die Datei von einem Drittprogramm gesperrt worden ist.

Meine Frage ist also nicht, wie kopier ich viele Dateien gesamt von a nach b, sondern warum wird versucht die Dateien zu öffnen und nicht gemäß dem Befehl kopiert.

Viele Grüße

Hob

Hallo Reinhard,

ich kann nicht sicherstellen, dass auf jedem Zielrechner Office installiert ist, deshalb ist mir der Batch-Ansatz lieber.

Viele Grüße

Hob

ich kann nicht sicherstellen, dass auf jedem Zielrechner
Office installiert ist, deshalb ist mir der Batch-Ansatz
lieber.

Hallo Hob,

Office hat VBA, ich sprach von VBS, da braucht man kein Office.

Nimm mal einen Texteditor und schreib rein:

MsgBox „Huhu“

und speichere das als „Name.vbs“ ab. Dann starte es über den Explorer…

Gruß
Reinhard

Hi,

habs versucht, aber da öffnet sich bloß wieder die Textdatei.

-/

VG

Hob

habs versucht, aber da öffnet sich bloß wieder die Textdatei.

Hallo Hob,

mit Doppelklick? Vielleicht stimmt die Verknüpfung nicht.

Gehe mal im Explorer auf Extras—Ordneroptionen, bei mir (WinXP) sieht das für vbs so aus:

http://www.bilder-space.de/bilder/9ec0c8-1265283793.jpg

Gruß
Reinhard

Hi Reinhard,

so funktioniert das.

-)

Un nu?

VG

Hob

Un nu?

Hallo Hob,

das ist einfach, du schreibst eine Vbs die das macht was die Batch sollte :smile:)

Im Ernst, ich könnte das wahrscheinlich besser aber ich habe die batch nicht verstanden.
Ich weiß nicht was:

SET Path=%sPath:"=%

bedeutet. Set its mir schon bekannt und

SET Path=%Path%%Dateiname%

würde ich verstehen.

Kannst du nochmal erläutern was du von wo nach wo kopieren möchtest?

Stehen diese 50 Dateien alleine in einem Verzeichnis oder haben sie etwas markantes anhand dessen man sie aus der dateiliste des Verzeichnisses herausfiltern könnte.

Wenn nicht bleibt wohl nur sowas übrig :frowning:

Pfad1="c:\vorher\"
Pfad2="c:\nachher\"
Dat(0)="Datei1.txt"
Dat(1)="Datei2.txt"
Dat(2)="Datei3.txt"
...
Dat(49)="Datei50.txt"
For N = 0 to Ubound(Dat)
 Kopiere Pfad1&Dat(n) nach Pfad2&Dat(N)
next N

Gruß
Reinhard

Hallo,

ich habe eine Dateiliste, alle Dateien entstammen einem Quellverzeichnis. Die Zielverzeichnisse variieren.

Die Zielverzeichnisse können vorhanden sein, müssen aber nicht, wenn sie nicht vorhanden, müssen sie erstellt werden.

Ist eine Datei mit gleichem Namen im Zielverzeichnis vorhanden, muss sie überschrieben werden.

Pfad und Dateinamen kann ich sowohl für das Quell- als auch für das Zielverzeichnis getrennt auflisten.

Unter den Dateien sind auch ocx-Dateien, die registriert werden müssen. (regsrv32.exe)

VG

Hob

hallo Hob,

ich habe eine Dateiliste, alle Dateien entstammen einem
Quellverzeichnis.

Vbs könnte die Dateien aus dem Verzeichnis auslesen wenn es die einzigen dadrin sind, wenn nicht braucht es Erkennungsmerkmale, das war meine Frage.

Die Zielverzeichnisse können vorhanden sein, müssen aber
nicht, wenn sie nicht vorhanden, müssen sie erstellt werden.

Kein Akt.

Ist eine Datei mit gleichem Namen im Zielverzeichnis
vorhanden, muss sie überschrieben werden.

Auch okay.

Pfad und Dateinamen kann ich sowohl für das Quell- als auch
für das Zielverzeichnis getrennt auflisten.

In welcher Form wo/wie?

Unter den Dateien sind auch ocx-Dateien, die registriert
werden müssen. (regsrv32.exe)

Nicht alles auf einmal, erstmal das Andere zu lösen versuchen :smile:

Gruß
Reinhard

Hi Reinhard,

Vbs könnte die Dateien aus dem Verzeichnis auslesen wenn es
die einzigen dadrin sind, wenn nicht braucht es
Erkennungsmerkmale, das war meine Frage.

Mal von vorne, es handelt sich um Programmbibliotheken, die für verschiedene Anwendungen zur Verfügung gestellt werden sollen.

In welcher Form wo/wie?

Der Installer wird durch Access 2000 erstellt. Es ist aber halt nicht gewährleistet, dass alle Rechner, die diese Kopiererei betrifft auch ein Office Paket haben. Deshalb der Installer.

Nimmt man beipielsweise eine Access-Anwendung, bei der eine dll nicht gefunden wird, startet diese nicht mehr Ordnungsgemäß, sondern man muss manuell den Pfad zur dll eintragen.

Stellt man aber sicher, dass die Dateien dort liegen, wo sie hin sollen und startet erst dann, kann die Anwendung einwandfrei initialisiert werden.

Wie ist denn die Syntax von vbs? Eher Vb, also kennen die scripts Arrays, Schleifen, Errorhandling?

Danke!

VG

Hob

Hallo,

ich bin jetzt länger nicht da, werde mich dann nochmals bemühen,
sobald ich wieder daran arbeiten kann.

Bitte nicht wundern, wenn keine Antwort kommt, kann die Artikel
derzeit nicht weiterverfolgen.

Vielen Dank an alle Helfer!

VG

Hob

Hallo Hob,

ich bin jetzt länger nicht da, werde mich dann nochmals
bemühen,
sobald ich wieder daran arbeiten kann.

scad, dann wird der Beitrag im Archiv sein.

Lade dir das da mal runter, da sind viele Beispielcodes was VBS kann:

http://www.vbsedit.com

Gruß
Reinhard

Hallo Hob,

war länger dienstlich unterwegs und kann deshalb erst heute
zurückschreiben.

Sowas kenne ich!

Ich war davon ausgegangen, dass es nur ein einziges Zielverzeichnis gibt.

Woraus leitet sich das jeweilige Zielverzeichnis ab? Aus einem Kennzeichen im Dateinamen? Wenn das so ist, könntest Du die Kopierroutine mehfach ablaufen lassen, so dass Du jeweils mit Platzhaltern die Dateien abgreifst und in das entsprechende Verzeichnis kopierst.

Meine Frage ist also nicht, wie kopier ich viele Dateien
gesamt von a nach b, sondern warum wird versucht die Dateien
zu öffnen und nicht gemäß dem Befehl kopiert.

Nach meiner Methode wird nur kopiert.

Ich habe für eigene Zwecke ein Utility SHIFTER geschrieben, das in einem Verzeichnis alle Dateien liest, die einem Pattern entsprechen, aus einem Substring des Dateinamens das Zielverzeichnis ermittelt und ggf. erzeugt. Das kann über eine Oberfläche definiert und auch als Konfiguration abgespeichert werden. Ist in C++ geschrieben und als .exe selbstständig aufrufbar.

Thomas