3.5k Aufrufe
Gefragt in Windows 7 von smbbln24 Mitglied (295 Punkte)
Hallo zusammen,

ich habe eine batch, welche einen relativ individuellen Kopiervorgang ermöglicht. Dieser sieht momentan so aus:

0@ECHO OFF & setlocal
ECHO OFF
COLOR 2F
CLS


ECHO Bitte folgende Angaben vornehmen ...

ECHO OFF
REM Set /P Quelllaufwerk="Bitte den Laufwerksbuchstaben des Quelllaufwerkes angeben:--> "
REM ECHO..............................................................................
REM Set /P Ziellaufwerk="Bitte den Laufwerksbuchstaben des Ziellaufwerkes angeben:--> "
REM ECHO..............................................................................
REM Set /P Zielverzeichniss="Name des Zielverzeichniss?-->"

ECHO..............................................................................
Set /P Quelllaufwerk="Bitte den Laufwerksbuchstaben des Quelllaufwerkes angeben:--> "
ECHO..............................................................................
Set /P Ziellaufwerk="Bitte den Laufwerksbuchstaben des Ziellaufwerkes angeben:--> "
ECHO..............................................................................
Set /P Quellverzeichniss="Name des Quellverzeichniss?-->"
ECHO..............................................................................
Set /P TitelID="TitelID angeben?-->"
ECHO..............................................................................
Set /P Dateityp="Bitte den Dateityp (Bsp: *.jpg) eingeben --> "
ECHO..............................................................................
ECHO KOPIERVORGANG STARTET
ECHO...

D:
cd test
mkdir %TitelID%
icacls "%Ziellaufwerk%:\test\%TitelID%" /inheritance:r /grant:r jeder:f system:f Administrator:f
copy "%Quelllaufwerk%:\%Quellverzeichniss%\%Dateityp%" "%Ziellaufwerk%:\test\%TitelID%" >> logfile.txt

ECHO.
ECHO Die Datenuebertragung wurde abgeschlossen ...

PAUSE

REM -------------------------- E O F ---------------------------

Fragt also nach einem Quelllaufwerk, Ziellaufwerk und Quellverzeichniss und packt es hier in dem Beispiel dann in einen festgelegten Testordner.

Meine Frage:

Wie ist es möglich, oder ist es überhaupt möglich, mehrere Zielverzeichnisse anzugeben, bevor die batch in den Copy Befehl läuft?

Ich müsste ja auf jeden Fall eine IF Bedingung setzen um eine Abruchbedingung zu schaffen. Dementsprechend muss ich natürlich auch eine Variable setzen. Mit der Frage: Willst du aus mehreren Verzeichnissen kopieren, wenn ja wie viele" oder so ähnlich.

Wenn ich es richtig gesehen habe könnte ich doch eventuell mit Sprungmarken via IF und GoTo arbeiten.
Das Problem was ich sehe, ist, dass ich vorher ja schlecht mehrere Zielverzeichnisse speichern kann, da die Variable Zielverzeichniss ja jedesmal überschrieben werden würde.

Hat irgendwer einen Gedankenanstoss den ich gerade nicht sehe?

Danke euch

12 Antworten

0 Punkte
Beantwortet von
ist es überhaupt möglich, mehrere Zielverzeichnisse anzugeben, bevor die batch in den Copy Befehl läuft?
- Hallo, ist damit gemeint, dass erst mal vorhandene Laufwerke abgefragt sollen?


mfg
0 Punkte
Beantwortet von
emm, mehrere Zielverzeichnisse anzugeben
Ich habe mir die Frage selber beantwortet;-))
0 Punkte
Beantwortet von power-poler Experte (3.7k Punkte)
Was willst du jetzt?
Willst du eine Datei in 2 Ziellaufwerke Kopieren
Oder willst du aus Mehreren Quellaluwerke in ein Ziellaufwerk kopieren.

mehrere Zielverzeichnisse anzugeben

Aber dan das:
Willst du aus mehreren Verzeichnissen kopieren, wenn ja wie viele" oder so ähnlich.
0 Punkte
Beantwortet von smbbln24 Mitglied (295 Punkte)
Hi und schonmal danke für die Antworten.

Sorry für die nicht ganz so klare Ausdrucksweise.

Also ich möchte es gerne so, dass ich mehrere Quellen angeben kann. Es geht dabei eigentlich immer um das gleiche Laufwerk, aber eben um verschiedene Quellverzeichnisse aus denen ganz bestimmte Daten auf ein Ziellaufwerk kopiert werden sollen. Wie man im Batch schon sieht, soll auf dem Ziellaufwerk auch immer ein speziefischer Ordner für die jeweiligen Daten angelegt werden (kann man sicher auch eleganter lösen --> xcopy usw.).
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Wie ist es möglich, oder ist es überhaupt möglich, mehrere Zielverzeichnisse anzugeben, bevor die batch in den Copy Befehl läuft?

Der Aufwand dürfte relativ zu hoch sein.

Theoretisch kannst du in Schleifen Variablen auffüllen die an erkennbaren Separatoren wieder aufgedröselt werden.

Praktisch sollte schon dieses Beispiel dem einen Riegel vorschieben:
Es möge C:\Otto.Dat und D:\Hans.Dat geben. Wenn da als Laufwerke C und D sowie als Quelldatien Hans.Dat und Otto.Dat angegebne werden müsste auch nach C:\Hans.Dat gesucht werden die es eventuell nicht gibt oder eventuell nicht mit in die Kopieraktion soll.

Kurz: du musst alle Quellen mühsam präzise benennen und bist damit von der Handhabung so oder so der Gekniffene.
Nur einigermaßen statische Konstrukte mit XCOPY (evtl. MS ROBOCOPY) lassen sich mit solchen Stapeljobs effizient abfrühstücken.

Eric March
0 Punkte
Beantwortet von smbbln24 Mitglied (295 Punkte)
Also das Problem sehe ich in dem Fall eher nicht.
Bei der Quelle geht es immer um ein bestimmtes Verzeichniss. Der Dateityp und die Datien die ich brauche sind immer die selben. Es gibt da Dateien welche eine 64 und eine 128 im Dateinamen enthalten. Ich filtere immer *64*.aac. Das ist das was ich brauche. Und diese gehen im Zielverzeichniss ja auch immer in das vordefinierte Verzeichniss.

Mal angenommen ich beschränke die batch auf maximal 20 Ziele. Dann müsste ich für jede Variable, zwanzig mögliche Variablen definieren (Quellverzeichnis1, Quellverzeichnis 2...etc). Je nach dem Was am Anfang eingegeben wurde (Wieviele Ordner sollen kopiert werden?) so oft würde die Schleife immer wieder die Abfragen durchgehen und entsprechend die Variablen füllen. Anschließend, wenn die Abruchbedingung erfüllt ist läuft die batch entsprechend in die xcopy Befehle rein. Das ist zwar super Aufwendig, sollte doch aber funktionieren, oder?

Oder geht es gar einfacher?
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Vielleicht hatte ich das nicht deutlich genau herausgestrichen:
Der Knackpunkt ist, die Batch mit Daten zu füttern - was auch heißt, im Falle nicht gewünschter Kopieraktionen per Hand Leerwerte einzugeben. Das ist maximal unkomfortabel.

Das ist nun mal keine WIN-Oberfläche mit Häkchen. Batch heißt mit relativ starren Regeln ein häufiges ›Fire-and-Forget‹ und keine dauernde Feinsteuerung.
Wenn immer nur bestimmte, immer gleiche, Kopierzüge mit möglichst gleichartiger Schaltung (64/128) je Auslösung geplant sind programmiert man das eher starr und wählt über IF aus. Aber immer Quellverzeichnisse einzugeben ist schlicht unwirtschaftlich; da könnte man fast, wenn man immer Word offen haben mag, dessen VBA als Interface einspannen.

Wenn du uns quasi alle Kombinationen anbietest könnte man überlegen wie man das am besten integriert.

Eric March
0 Punkte
Beantwortet von smbbln24 Mitglied (295 Punkte)
Ok. Dann versuche ich das Szenario mal genauer zu beschreiben.

Es geht immer um das gleiche Quelllaufwerk, in dem Fall sagen wir mal A:

Dann muss ein Pfad angegeben werden: Bsp: bk\adko\000737ade\aax --> dieser Pfad variert

Es muss eine Titel-ID angegeben werden, da ich damit das Verzeichnis auf dem Ziellaufwerk erzeuge.

Ein Ziellaufwerk oder Zielverzeichnis muss eigentlich nicht eingegeben werden, da es immer D:\test\%TitelID% ist

So wie ich die batch oben angegeben habe, funktioniert sie auch. Nur wäre es wichtig, dass der Stapeljob mehrere Zielverzeichnisse abgrasen soll. Deshalb dachte ich an eine Art schleife.

Ich möchte die Datei halt starten und die entsprechenden Zielverzeichnisse eingeben und dann soll der Copy über Nacht laufen. Das möchte ich, da die Netzwerkverbindung zum Quelllaufwerk unglaublich langsam ist, also auch händisch sehr grenzwertig. Deshalb kam mir die Idee:

Hier nochmal die bisherige Batch:

0@ECHO OFF & setlocal
ECHO OFF
COLOR 2F
CLS

ECHO ------------------------------------------------------------

ECHO Name: COPY

ECHO ------------------------------------------------------------

:WEITER
CALL copy_by_MS.bat

ECHO Bitte folgende Angaben vornehmen ...

ECHO..............................................................................
Set /P Quelllaufwerk="Bitte den Laufwerksbuchstaben des Quelllaufwerkes angeben:--> "
ECHO..............................................................................
Set /P Ziellaufwerk="Bitte den Laufwerksbuchstaben des Ziellaufwerkes angeben:--> "
ECHO..............................................................................
Set /P Quellverzeichniss="Name des Quellverzeichniss?-->"
ECHO..............................................................................
Set /P TitelID="TitelID angeben?-->"
ECHO..............................................................................
Set /P Dateityp="Bitte den Dateityp (Bsp: *.jpg) eingeben --> "
ECHO..............................................................................
ECHO KOPIERVORGANG STARTET
ECHO...

D:
cd test
mkdir %TitelID%
icacls "%Ziellaufwerk%:\test\%TitelID%" /inheritance:r /grant:r jeder:f system:f Administrator:f
copy "%Quelllaufwerk%:\%Quellverzeichniss%\%Dateityp%" "%Ziellaufwerk%:\test\%TitelID%" >>"%Ziellaufwerk%:\test\%TitelID%\%date%_logfile.txt"
echo Kopiervorgang am %date% um %time% >>"%Ziellaufwerk%:\test\%TitelID%\%date%_logfile.txt"

ECHO.

ECHO Die Datenuebertragung wurde abgeschlossen ...

REM -------------------------- E O F ---------------------------

Ich hatte jetzt noch folgenden Gedanken. Wenn ich die ersten Eingaben gemacht habe und dann vielleicht noch folgendes Einsetze:
Set /P Jobs="Weitere Quellverzeichnisse angeben j/n? --> "
ECHO..............................................................................

Dann vor dem eigentlichen Kopierjob die Abfrage:

IF "Jobs" == "j"

Und hier weiß ich nicht weiter:

Könnte ich nicht mit call die Datei nochmal aufrufen? Es doch so, dass die erste Batch erst weitergeht, wenn die als zweites aufgerufene Batch beendet wird. Wäre das nicht eine Lösung?

Irgendwie bekomme ich es aber nicht hin mit dem CALL Befehl...
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Bitte nicht nochmal diesen unleserlichen Code - die Anforderungen, etwa so:

C:\Eins\Otto64.txt -> X:\Zehn\; Y:\Zehn\; Y:\Zwanzig\; Z:\Zwanzig\
C:\Eins\Otto128.txt -> X:\Zehn\; Y:\Zehn\; Y:\Zwanzig\; Z:\Zwanzig\
D:\Fünf\Otto64.txt -> X:\Zehn\; Y:\Zehn\
D:\Fünf\Otto128.txt -> X:\Zehn\; Y:\Zehn\
C:\Zwei\Otto64.txt -> Y:\Zwanzig\; Z:\Zwanzig\

{Die Ziele sind natürlich keine UNDs sondern ODERs!}

Kurz - irgendwelche Eckdaten die die Varietäten erkenne lassen, die erkenne lassen was wirklich einzugeben wäre und was nicht.

Ich bleibe dabei - das kann man gewiss programmieren, aber die (Be)Nutzbarkeit strebt nicht nur gegen Null, sie geht ins Negative.
[Lass dir das von einem der größten Faultiere unter der Sonne sagen. Wenn ich da einen durchschlagenden Automatisierungskomfort sähe dann würde ich ihn anbieten.]

Eric March
0 Punkte
Beantwortet von smbbln24 Mitglied (295 Punkte)
Danke für die Antwort, aber ich glaube wir reden doch noch von unterschiedlichen Dingen.

Wenn du von (Be)Nutzbarkeit sprichst, dann meinst du sicher den armen Kerl der es am ende benutzen soll, richtig?

Wieso ist der Code unleserlich? Dachte daraus wird ersichtlich um was es mir geht. Bin kein Programmierer musst du wissen, mache mir aber mit einer paar Stapelverarbeitungen, gerne mal das Leben leichter.

Das ich kein Programmierer bin, mag auch dazu führen, dass ich dein aufgezeigtes Beispiel nicht recht verstehen will. Aber soweit ich es verstehe (und ich glaube ich weiß was du damit meinst), habe ich doch ein anderes Ziel, als du annimmst.

Ich habe jetzt auch eine Lösung für mich gefunden. Ein Programmierer würde sich wahrscheinlich an den Kopf greifen, aber es funktioniert. Die Eingabe von Quellpfaden hab ich zwar auf zwanzig begrenzt, da sonst sowas von Spagetti Code angesagt ist, aber gut. Ich habe was ich wollte.

Dachte halt man könnte das kompakter mit ne schicken Schleife machen (geht sicher auch), aber ok.

Im groben sieht das jetzt so aus:

Abfragen und Variablen setzen:
:Eingabe1
- Aus wie vielen Quellverzeichnissen soll kopiert werden (1-20)?
- Von welchem Laufwerk?
- Quellverzeichnis?
- Dateityp? (kann ich mir sparen, da es immer *64*.aac ist)

if Anzahl Quellverzeichnisse >1
goto :Eingabe 2
goto :Verarbeitung
...
..
..
das würde dann noch neunzehnmal kommen, die Variablen erhalten einen zähler hinten dran usw.

dann kommt :Verarbeitung wo die Kopierbefehle abgearbeitet werden und dann goto :end

Nicht schön aber zweckmäßig :-)
...