david1995
Goto Top

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

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

erikro
Lösung erikro 07.03.2019 um 09:06:16 Uhr
Goto Top
Moin,

da würde ich ja immer einen vernünftigen Dateimanager nehmen. face-wink Aber wenn es denn ein Skript sein soll, hier eine Powershell-Lösung:

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
David1995
David1995 07.03.2019 um 09:35:44 Uhr
Goto Top
Hallo Erikro,

vielen Dank für deine Hilfe.
Die optimale Lösung wäre es, von einer Zusatzsoftware abzusehen und es bei einem Skript zu belassen.
Gerne würde ich deinen PowerShell Skript ausprobieren! Was muss ich daran noch anpassen, damit er in meiner Umgebung funktioniert?
Sucht dieses Skript mein Quellverzeichnis nach Beispielsweise 1122334455_rev8_A/AA ab und verschiebt diese Datei/en dann in den erstellen Ordner? Und wo kann ich die Abfrage bezüglich 1000 & 2000 finden? Wo lege ich fest, wo der Zielordner erstellt werden soll?

Vielen Dank das du mir hilfst!

Gruß
David
erikro
erikro 07.03.2019 um 09:43:57 Uhr
Goto Top
Moin,

Zitat von @David1995:
vielen Dank für deine Hilfe.

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
David1995
David1995 07.03.2019 um 09:59:01 Uhr
Goto Top
Leider funktioniert das nicht so wie es soll.
Eine Quelle wurde eingetragen - die Datei kann aber nicht gefunden werden (spielt die Dateiendung eine Rolle?)
Ein Ziel, wo dieser neue Ordner erstellt werden soll kann ich leider nicht einpflegen.

Ich werde gefragt nach der Revision und der Nummer, nicht aber nach 1000 oder 2000...

Wahrscheinlich stehe ich hier auf dem Schlauch... In PowerShell bin ich leider sehr unerfahren.


Viele Grüße,
David
erikro
erikro 07.03.2019 um 10:05:30 Uhr
Goto Top
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?)

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
David1995
David1995 07.03.2019 um 10:16:51 Uhr
Goto Top
Das mit der Dateiendung sollte funktionieren. Dort habe ich nun einfach .txt eingepflegt.


Bezüglich Zielordner:
Dieser soll standardmäßig in "D:\Users\David\Documents\Ziel" erstellt werden.

Kopiert werden die Dateien dann von "C:\Users\David\Documents\Test_Powershell"
Hier soll das Skript die deklarierten Dateien suchen.
Falls diese dort gefunden werden, sollen sie nach "D:\Users\David\Documents\Ziel" in den neu erstellten Ordner kopiert werden.
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.


Viele Grüße,
David
erikro
erikro 07.03.2019 um 10:26:25 Uhr
Goto Top
Moin,

Zitat von @David1995:
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
David1995
David1995 07.03.2019 um 11:08:59 Uhr
Goto Top
Okay, Quelle passt soweit, Ziel ebenfalls.
Führe ich das Skript aus, wird der Ordner wie gewünscht erstellt.
Bim Kopieren taucht wohl ein Fehler auf:
Mode LastWriteTime Length Name
------------- ------ ----
d----- 07.03.2019 11:05 Test111
Copy-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
In C:\Users\David\Documents\Test_Powershell\Ziel\PowerShell.ps1:45 Zeichen:11

back-to-topcopy-item $file.txt $ordner

back-to-top~~~~~~~~~

+ CategoryInfo : InvalidData: (face-smile [Copy-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand


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.


Gruß
David
erikro
Lösung erikro 07.03.2019 um 12:00:24 Uhr
Goto Top
Zitat von @David1995:
Copy-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.

Oooops, mein Fehler. Da hat er vollkommen recht. face-wink

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. face-wink

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.

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.
David1995
David1995 07.03.2019 um 12:29:31 Uhr
Goto Top
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
erikro
Lösung erikro 07.03.2019 aktualisiert um 12:44:30 Uhr
Goto Top
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

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!"  

}
David1995
David1995 07.03.2019 um 13:11:59 Uhr
Goto Top
Jetzt funktioniert der Grundgedanke an sich sehr gut!

Zwei Dinge gibt es allerdings noch:

Bei 1000 wird AA kopiert (was vollkommen korrekt ist)
Bei 2000 wird nur AAA anstelle AA + AAA kopiert.

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?

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.


Ich bedanke mich noch einmal recht herzlich für deine großzügige Hilfe!!!


Gruß
David
erikro
Lösung erikro 07.03.2019 um 13:45:15 Uhr
Goto Top
Zitat von @David1995:
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. face-wink


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.

Man kann alles mögliche machen. face-wink Das ist ein Toyota (Nichts ist unmöglich). face-wink
David1995
David1995 07.03.2019 um 15:52:04 Uhr
Goto Top
Also ich muss schon sagen... Das funktioniert wunderbar!
1000 & 2000 funktionieren und der Ordner wird dort abgelegt, wo er abgelegt werden soll.

Wenn es für dich kein Problem ist - willst du mir das mit der Schleife noch zeigen?

Und zu deinem Trick von vorhin... Wie maskiere ich denn ein Bindestrich (-) Anstelle der 1000 kann z.B eine 1000-1 nicht gelesen werden...


Viele Grüße,
David
David1995
David1995 07.03.2019 um 15:53:42 Uhr
Goto Top
Das mit dem Maskieren des Bindestriches habe ich geschafft face-smile
erikro
erikro 07.03.2019 um 16:01:52 Uhr
Goto Top
Zitat von @David1995:

Das mit dem Maskieren des Bindestriches habe ich geschafft face-smile

Ahja. face-smile Versuch mach kluch. face-wink

Was soll denn die Schleife tun?
David1995
David1995 07.03.2019 um 16:13:03 Uhr
Goto Top
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 face-smile
David1995
David1995 07.03.2019 um 16:13:51 Uhr
Goto Top

Ahja. face-smile Versuch mach kluch. face-wink

total face-smile
erikro
erikro 07.03.2019 um 16:15:43 Uhr
Goto Top
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 face-smile

OK, was für Dateien? Wie sehen die aus? Nach welchen Kriterien wird der Bedarf festgestellt?
David1995
David1995 07.03.2019 um 18:23:07 Uhr
Goto Top
Hierbei geht es um 3D Druck. Ich habe eine Plattformnummer sowie eine Stammnummer. Aus der Plattformnummer erkenne ich, ob zur Nummer mehrere Bauteile gehören oder nur das eine (1000-2000). Ist diese Auswahl getroffen und die Dateien im Ordner kann ich weiter entscheiden, ob ich noch weitere Bauteile auf die Plattform mit aufnehme (hierfür die Schleife). Ist die Plattform voll bzw. reichen mir die Teile aus, so beende ich die Schleife durch das beenden der PowerShell Oberfläche.

Ich hoffe, das erklärt etwas den Ablauf face-smile


Gruß
David
erikro
erikro 08.03.2019 um 08:35:00 Uhr
Goto Top
Ok, aber woran erkennst Du, was Du aufnehmen willst? Oder soll das mittels einer weiteren Eingabe geschehen?
David1995
David1995 08.03.2019 um 15:49:12 Uhr
Goto Top
Sorry, aber was aufnehmen?
Habe die Frage nicht ganz verstanden, tut mir leid.
erikro
erikro 08.03.2019 um 15:53:51 Uhr
Goto Top
Na welche Dateien Du in den Prozess aufnehmen willst. Wie entscheidest Du, was noch kopiert werden soll? Automatisch? Erneute Eingabe? Wenn automatisch, anhand welcher Kriterien?
David1995
David1995 10.03.2019 um 18:59:40 Uhr
Goto Top
Sorry, jetzt..
Das wird händisch entschieden. Der Prozess mit dem Kopieren soll solange weiterlaufen, bis der Benutzer das Fenster schließt.