Verschiedene Dateien mit wechselndem Dateinamen verschieben (mit diversen Abfragen) - Batch
Hallo zusammen,
ich versuche mein Problem so detailliert wie möglich zu beschreiben:
Ich möchte in einer Batch einen Ordner erstellen, nach dessen Namen mich die Batch fragen soll.
Anschließend sollen aus einem Netzlaufwerk 1-2 Dateien aus einem riesigen Verzeichnis dort hinein kopiert werden.
Ob es eine oder zwei Dateien sind, wird ebenfalls wieder über eine Benutzereingabe festgelegt.
Der Name dieser Dateien ist immer unterschiedlich, beinhaltet aber immer dieselbe Anzahl an Ziffern mit einer Revision ("RevX")
Eine Abfrage durch den Benutzer, welche Revision kopiert werden soll, sollte ebenfalls vorhanden sein.
Beispiel Dateiname 1: 1122334455_rev8_AA
Beispiel Dateiname 2: 1122334455_rev8__AAA
Beispiel Ablauf:
1. Abfrage Ordnername: "Test123"
2. Ordner "Test 123" wurde erstellt
3. Abfrage Revision
4. Benutzereingabe: "8" (Revision 8)
5. Variable der Rev auf "8" deklariert.
6. Abfrage der 10-stelligen Nummer
7. Benutzereingabe "1122334455"
8. Variable der Nummer auf "1122334455" deklariert.
9. Abfrage der Anzahl von Dateien (bei Eingabe "1000" nur Datei "1122334455_rev8_AA" kopieren)
9.1 bei Eingabe "2000" zusätzlich Datei 1122334455_rev8_AAA kopieren.
Leider reichen meine Programmierkenntnisse hierfür nicht aus. Ich kann sehr gut mit Robocopy u.ä arbeiten, was aber das tiefgründige Arbeiten mit Variabeln und deren Deklarierungen angeht, muss ich leider passen.
Vielen Dank für eure Mithilfe!
Viele Grüße,
David
ich versuche mein Problem so detailliert wie möglich zu beschreiben:
Ich möchte in einer Batch einen Ordner erstellen, nach dessen Namen mich die Batch fragen soll.
Anschließend sollen aus einem Netzlaufwerk 1-2 Dateien aus einem riesigen Verzeichnis dort hinein kopiert werden.
Ob es eine oder zwei Dateien sind, wird ebenfalls wieder über eine Benutzereingabe festgelegt.
Der Name dieser Dateien ist immer unterschiedlich, beinhaltet aber immer dieselbe Anzahl an Ziffern mit einer Revision ("RevX")
Eine Abfrage durch den Benutzer, welche Revision kopiert werden soll, sollte ebenfalls vorhanden sein.
Beispiel Dateiname 1: 1122334455_rev8_AA
Beispiel Dateiname 2: 1122334455_rev8__AAA
Beispiel Ablauf:
1. Abfrage Ordnername: "Test123"
2. Ordner "Test 123" wurde erstellt
3. Abfrage Revision
4. Benutzereingabe: "8" (Revision 8)
5. Variable der Rev auf "8" deklariert.
6. Abfrage der 10-stelligen Nummer
7. Benutzereingabe "1122334455"
8. Variable der Nummer auf "1122334455" deklariert.
9. Abfrage der Anzahl von Dateien (bei Eingabe "1000" nur Datei "1122334455_rev8_AA" kopieren)
9.1 bei Eingabe "2000" zusätzlich Datei 1122334455_rev8_AAA kopieren.
Leider reichen meine Programmierkenntnisse hierfür nicht aus. Ich kann sehr gut mit Robocopy u.ä arbeiten, was aber das tiefgründige Arbeiten mit Variabeln und deren Deklarierungen angeht, muss ich leider passen.
Vielen Dank für eure Mithilfe!
Viele Grüße,
David
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 425365
Url: https://administrator.de/forum/verschiedene-dateien-mit-wechselndem-dateinamen-verschieben-mit-diversen-abfragen-batch-425365.html
Ausgedruckt am: 21.04.2025 um 16:04 Uhr
24 Kommentare
Neuester Kommentar
Moin,
da würde ich ja immer einen vernünftigen Dateimanager nehmen.
Aber wenn es denn ein Skript sein soll, hier eine Powershell-Lösung:
hth
Erik
da würde ich ja immer einen vernünftigen Dateimanager nehmen.
param (
[parameter(Mandatory=$true)]
$ordner,
[parameter(Mandatory=$true)]
$revision,
[parameter(Mandatory=$true)]
$nummer,
[switch]$beide_Dateien
)
$source_path = "WoauchimmerdieDateienliegen"
if(!$(test-path $ordner)) {
New-Item -ItemType "Directory" -path $ordner
}
$file = $source_path + "\" + $nummer + "_rev" + $revision + "_AA"
copy-item $file $ordner
if($beide_Dateien) {
$file = $file + "A"
copy-item $file $ordner
}
hth
Erik
Moin,
Gerne.
Powershell ist keine Zusatzsoftware, sondern fester Bestandteil von Windows ab Windows 8.
Nichts, außer dass Du das Ausführen solcher Skripts zulassen musst.
Es erstellt, sofern nicht vorhanden, den Zielordner und kopiert, sofern vorhanden, die Dateien nach Deinem Muster. Sollen sie verschoben werden, dann ändere "copy-item" in "move-item".
Aufruf des Skripts:
Die ersten drei Parameter sind obligatorisch, der letzte, mit dem entschieden wird, ob beide kopiert werden sollen oder nur eine, ist optional. Lässt Du ihn weg, wird nur eine kopiert.
Liebe Grüße
Erik
Gerne.
Die optimale Lösung wäre es, von einer Zusatzsoftware abzusehen und es bei einem Skript zu belassen.
Powershell ist keine Zusatzsoftware, sondern fester Bestandteil von Windows ab Windows 8.
Gerne würde ich deinen PowerShell Skript ausprobieren! Was muss ich daran noch anpassen, damit er in meiner Umgebung funktioniert?
Nichts, außer dass Du das Ausführen solcher Skripts zulassen musst.
get-help set-ExecutionPolicy
Sucht dieses Skript mein Quellverzeichnis nach Beispielsweise 1122334455_rev8_A/AA ab und verschiebt diese Datei/en dann in den erstellen Ordner?
Es erstellt, sofern nicht vorhanden, den Zielordner und kopiert, sofern vorhanden, die Dateien nach Deinem Muster. Sollen sie verschoben werden, dann ändere "copy-item" in "move-item".
Und wo kann ich die Abfrage bezüglich 1000 & 2000 finden? Wo lege ich fest, wo der Zielordner erstellt werden soll?
Aufruf des Skripts:
skriptname.ps1 -ordner Zielordner -revision Revisionsnummer -nummer zehnstelligeNummer -beide_Dateien
Die ersten drei Parameter sind obligatorisch, der letzte, mit dem entschieden wird, ob beide kopiert werden sollen oder nur eine, ist optional. Lässt Du ihn weg, wird nur eine kopiert.
Liebe Grüße
Erik
Zitat von @David1995:
Leider funktioniert das nicht so wie es soll.
Eine Quelle wurde eingetragen - die Datei kann aber nicht gefunden werden (spielt die Dateiendung eine Rolle?)
Leider funktioniert das nicht so wie es soll.
Eine Quelle wurde eingetragen - die Datei kann aber nicht gefunden werden (spielt die Dateiendung eine Rolle?)
Ja klar. Die Datei muss schon so heißen, wie sie angegeben wurde. Wenn da noch Dateiendungen dahinter müssen, dann ändere so:
copy-item $file.dateiendung $ordner
oder, wenn die Dateiendung nicht klar ist:
copy-item $file.* $ordner
Dann werden aber alle Dateien, die so heißen unabhängig von der Endung kopiert.
Ein Ziel, wo dieser neue Ordner erstellt werden soll kann ich leider nicht einpflegen.
Heißt was? Der übergeordnete Ordner muss exisiterien.
Ich werde gefragt nach der Revision und der Nummer, nicht aber nach 1000 oder 2000...
Das habe ich als Switch gestaltet. Mit -beide_Dateien kopiert das Skript beide Dateien und ohne nur eine. Muss das mit 1000 bzw. 2000 angegeben werden?
Liebe Grüße
Erik
Moin,
Dann führst Du entweder das Skript in dem Ordner aus und gibst mit
den Namen des Unterordners an oder Du schreibst den vollen Pfad hinter -ordner. Achtung, enthält der Pfad Leerzeichen, dann muss er in Anführungszeichen gesetzt werden.
Dann änderst Du die Variable $source_path in
Das macht er.
Schon klar. Die Frage war, ob es zwingend als 1000 oder 2000 angegeben werden muss oder auch anders angegeben werden kann. Ich habe das jetzt als Schalter programmiert. Also wenn der Aufruf mit -beide_Dateien erfolgt, dann kopiert es beide. Lässt Du den Schalter weg, kopiert es nur eine. BTW: Im ursprünglichen Post waren hinten zwei bzw. drei As. Jetzt sind es nur eins bzw. zwei.
Liebe Grüße
Erik
Zitat von @David1995:
Bezüglich Zielordner:
Dieser soll standardmäßig in "D:\Users\David\Documents\Ziel" erstellt werden.
Bezüglich Zielordner:
Dieser soll standardmäßig in "D:\Users\David\Documents\Ziel" erstellt werden.
Dann führst Du entweder das Skript in dem Ordner aus und gibst mit
-ordner unterordner
den Namen des Unterordners an oder Du schreibst den vollen Pfad hinter -ordner. Achtung, enthält der Pfad Leerzeichen, dann muss er in Anführungszeichen gesetzt werden.
Kopiert werden die Dateien dann von "C:\Users\David\Documents\Test_Powershell"
Dann änderst Du die Variable $source_path in
$source_path = "C:\Users\David\Documents\Test_Powershell"
Falls diese dort gefunden werden, sollen sie nach "D:\Users\David\Documents\Ziel" in den neu erstellten Ordner kopiert werden.
Das macht er.
Das mit der Abfrage 1000 & 2000 muss zwingend geschehen da dies entscheidet, ob nur xxxxxxx_A oder zusätzlich noch xxxx_AA kopiert werden soll.
Schon klar. Die Frage war, ob es zwingend als 1000 oder 2000 angegeben werden muss oder auch anders angegeben werden kann. Ich habe das jetzt als Schalter programmiert. Also wenn der Aufruf mit -beide_Dateien erfolgt, dann kopiert es beide. Lässt Du den Schalter weg, kopiert es nur eine. BTW: Im ursprünglichen Post waren hinten zwei bzw. drei As. Jetzt sind es nur eins bzw. zwei.
Liebe Grüße
Erik
Zitat von @David1995:
Copy-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
Copy-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
Oooops, mein Fehler. Da hat er vollkommen recht.
Zur Erläuterung: Wenn ich mit einem Punkt getrennt an eine Variable was anhänge, dann heißt das in einer objektorientierten Sprache wie der Powershell, dass ich die Eigenschaft des Objekts ansprechen will. Also heißt $file.txt gib mir die Eigenschaft txt des Objekts $file. Die gibt es in unserem Skript nicht. Also ist die NULL und kann damit nicht als Quellangabe des zu kopierenden Files genommen werden. Logisch.
Um jetzt die Endung dranzuhängen, muss der Punkt maskiert werden, also seiner besonderen Bedeutung enthoben. Das geht mit dem Backtick:
$file`.txt
Jetzt ist der Punkt wieder ein einfache Punkt und alles ist gut.
Sorry mit dem Schalter. Natürlich ist es AA und AAA.
Das mit 1000 und 2000 war mehr ein Beispiel.
Es muss ein nummerischer Wert sein nach dem gefragt wird.
Das mit 1000 und 2000 war mehr ein Beispiel.
Es muss ein nummerischer Wert sein nach dem gefragt wird.
Warum? Warum geht es nicht mit dem Schalter? Ich frage deshalb, weil es ja um eine JA/NEIN-Frage geht, die man eben am Besten mit einem Schalter erledigt.
Zitat von @David1995:
Und wieder was dazu gelernt! Danke für die ausführliche Erklärung- solche Tricks nehme ich gerne auf.
Die Benutzereingabe wird eventuell mit einem Scanner erfolgen, und hier soll von einem gewissen Argument (1000, 2000) abhängig gemacht werden, ob nun AA oder AA + AAA kopiert werden.
Das ist der Hintegrund für die Abfrage.
VG,
David
Und wieder was dazu gelernt! Danke für die ausführliche Erklärung- solche Tricks nehme ich gerne auf.
Die Benutzereingabe wird eventuell mit einem Scanner erfolgen, und hier soll von einem gewissen Argument (1000, 2000) abhängig gemacht werden, ob nun AA oder AA + AAA kopiert werden.
Das ist der Hintegrund für die Abfrage.
VG,
David
Das ahnte ich schon fast. Dann muss das ein wenig geändert werden:
param (
[parameter(Mandatory=$true)]
$ordner,
[parameter(Mandatory=$true)]
$revision,
[parameter(Mandatory=$true)]
$nummer,
[parameter(Mandatory=$true)]
$beide_Dateien
)
$source_path = "WoauchimmerdieDateienliegen"
if(!$(test-path $ordner)) {
New-Item -ItemType "Directory" -path $ordner
}
$file = $source_path + "\" + $nummer + "_rev" + $revision + "_AA"
if($beide_Dateien -eq 1000) {
copy-item $file`.txt $ordner
}
elseif($beide_Dateien -eq 2000) {
copy-item $file`.txt $ordner
$file = $file + "A"
copy-item $file`.txt $ordner
}
else {
write-error "Der Parameter beide_Dateien muss entweder 1000 oder 2000 sein!"
}
Zitat von @David1995:
Bei 1000 wird AA kopiert (was vollkommen korrekt ist)
Bei 2000 wird nur AAA anstelle AA + AAA kopiert.
Bei 1000 wird AA kopiert (was vollkommen korrekt ist)
Bei 2000 wird nur AAA anstelle AA + AAA kopiert.
Dann warst Du beim Kopieren schneller als ich beim Korrigieren. Der Fehler ist mir auch kurz nach dem Posten aufgefallen. Ich habe das oben berichtigt. Im Elseif-Statement ist eine Zeile hinzugekommen.
Der Zielordner wird aktuell in meinem Stamm-Benutzerverzeichnis C:\Users\David erstellt. Kann ich noch definieren wo der neu erstellte Zielordner (welcher mit den Dateien gefüllt wird) abgelegt werden soll?
Du kannst jeden beliebigen Ordner (voller Pfad) angeben. Allerdings muss der übergeordnete Ordner existieren.
Kann man einen Loop einbauen, der mich nach dem ersten Kopiervorgang noch beliebig mehrere Vorgänge (im selben Ordner) starten lässt?
Das also der Ordner mit noch mehr Daten gefüllt wird... Beenden kann man das ganze dann ganz einfach über das Schließen von PowerShell.
Das also der Ordner mit noch mehr Daten gefüllt wird... Beenden kann man das ganze dann ganz einfach über das Schließen von PowerShell.
Man kann alles mögliche machen.
Ahja.
Was soll denn die Schleife tun?
Zitat von @David1995:
Die Schleife sollte sofern Bedarf besteht, weitere Dateien verschieben (von Grund auf, mit allen Abfragen) in den bereits erstellten Ordner. Das war mal so der Gedanke
Die Schleife sollte sofern Bedarf besteht, weitere Dateien verschieben (von Grund auf, mit allen Abfragen) in den bereits erstellten Ordner. Das war mal so der Gedanke
OK, was für Dateien? Wie sehen die aus? Nach welchen Kriterien wird der Bedarf festgestellt?